본문 바로가기
Language/JAVA

Optional + orElse 와 orElseGet 메서드 비교 테스트

by YoonJong 2023. 8. 15.
728x90

 

Optional

 

  • 결과가 null  이 절대 나올 수 없을 경우에는 사용하지 않는다.
  • Null 에 의해 오류가 발생할 가능성이 매우 높을때만 반환값으로 사용한다.
  • Optional 의 값을 확인하지 않고 접근하면 NPE 대신 NoSuchElementException 이 발생할 수 있다.

 

[ 올바른 Optional 사용법 가이드 ]

  • Optional 변수에 Null을 할당하지 말아라
  • 값이 없을 때 Optional.orElseX()로 기본 값을 반환하라
  • 단순히 값을 얻으려는 목적으로만 Optional을 사용하지 마라
  • 생성자, 수정자, 메소드 파라미터 등으로 Optional을 넘기지 마라
  • Collection의 경우 Optional이 아닌 빈 Collection을 사용하라
  • 반환 타입으로만 사용하라

 

 

https://mangkyu.tistory.com/70 - 1편

https://mangkyu.tistory.com/203 - 2편 

 

Optional<String> optional = Optional.empty();

System.out.println(optional); // Optional.empty

System.out.println(optional.isPresent()); // false

 

 

  • Null 절대 아닌 경우

- Optional.of 사용
- Null
저장하려고 하면 NPE 발생

 

  • Optional.ofNullable() : 값이 Null 수도, 아닐수도 있을 경우

// Optional value 값이 있을 수도 있고 null 수도 있다.

Optional<String> optional = Optional.ofNullable(getName());

String name = optional.orElse("anonymous");

// 값이 없다면 "anonymous" 리턴

 

 

List<String> nameList = Optional.ofNullable(getNames())

    .orElseGet(() -> new ArrayList<>());

// getNames() 의 값이 null 이면 함수 실행

 

 

orElse() : 파라미터로 값을 받는다.

orElseGet() : 파라미터로 함수형 인터페이스(함수) 를 받는다.

 

orElse와 orElseGet의 차이점 및 사용법 정리
orElseGet은 값이 준비되어 있지 않은 경우, orElse는 값이 준비되어 있는 경우에 사용

 

  • orElse
    - 파라미터로 값을 필요로한다.
    - 값이 미리 존재하는 경우에 사용한다.
  • orElseGet
    -
    파라미터로 함수(함수형 인터페이스) 필요로 한다.
    -
    값이 미리 존재하지 않는 거의 대부분의 경우에 orElseGet 사용하면 된다.

 

+ 더블콜론(참조)

:: -> 왼쪽 객체의 오른쪽 메소드를 사용한다는 의미

인스턴스 :: 메소드명 ( or new )

타겟레퍼런스 :: 메소드명

 

 

 

@Test
@DisplayName("orElse 는 값이 null 일때 어떻게 조회?")
void test1() {
    Object result = Optional.ofNullable(null)
            .orElse(test()); // 파라미터로 넘기기 때문에 호출된다.

    System.out.println("result = " + result);
    //called
    //result = yoonjong
}

@Test
@DisplayName("orElse 는 값이 null이 아닐때 어떻게 조회?")
void test2() {
    String result = Optional.ofNullable("값이 있음")
            .orElse(test()); // 파라미터로 넘기기 때문에 호출된다.

    System.out.println("result = " + result);
    //called
    //result = 값이 있음
}

@Test
@DisplayName("orElseGet 는 값이 null일 때 어떻게 조회?")
void test3() {
    Object result = Optional.ofNullable(null)
            .orElseGet(this::test); // 값이 없으므로, 함수를 호출한다.

    System.out.println("result = " + result);
    //called
    //result = yoonjong
}

@Test
@DisplayName("orElseGet 는 값이 null이 아닐때 어떻게 조회?")
void test4() {
    String result = Optional.ofNullable("값이 있음")
            .orElseGet(this::test); // 함수를 호출하지 않으므로 무시된다.

    System.out.println("result = " + result);
    // result = 값이 있음
}

private String test() {
    System.out.println("called");
    return "yoonjong";
}
728x90

'Language > JAVA' 카테고리의 다른 글

Null , isEmpty , isBlank 비교  (0) 2024.03.20
[JAVA] 깊은 복사 vs 얕은 복사  (0) 2023.08.20
스트림의 중간, 최종연산  (0) 2023.02.15
스트림(Stream) 의 특징  (0) 2023.02.13
람다식과 함수형 인터페이스  (0) 2023.02.13

댓글