ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Health-Genie] orElse() vs orElseGet() 차이
    Health-Genie 2024. 3. 6. 20:57
    728x90

    개념 정리

    orElse(), orElseGet() 2가지 모두 optional을 통해 NPE를 해결하는데 있어서 Null의 값이 출력될 때 default 값을 넣어주는 역할을 합니다.

     

    차이점

    public T orElse(T other)
    public T orElseGet(Supplier<? extends T> other)

     

    orElse는 T의 모든 매개변수를 사용합니다.

    orElseGet은 T 유형의 개체를 반환하는 Supplier 유형의 인터페이스를 허용합니다.

     

    public T orElse(T other) {
        return value != null ? value : other;
    }
    
    public T orElseGet(Supplier<? extends T> other) {
        return value != null ? value : other.get();
    }

     

    위의 코드를 보면 조금 더 명확히 차이점을 알 수 있습니다.

     

    orElse()는 T 클래스를 인수 받습니다.

    orElseGet()은 T 클래스를 상속받은 하위 클래스를 return 해주는 Supplier 함수 인터페이스를 받습니다

    -> Suppler는 결국 get을 호출하여 결과를 리턴하는 역할입니다.

     

    결론

    두가지 모두 null이든 아니든 모두 인자로 받은 값들을 호출을 합니다.

    다만, 메소드가 인자로 넘어갈 경우에 따라 인자 메소드 실행 타이밍이 달리진다는 점입니다.

     

     

    1) orElse()

    넘어오는 인자가 null 일때 값을 넘겨야 하면 사용한다.

     

    2) orElseGet() 

    인수로 전달된 Supplier 메소드 경우 Optional의 값이 없을 때만 get()을 통해 실행되는데, 결국 null일 경우 메소드를 실행해야 할때 사용한다. null일때만 호출이 되므로 성능상 조금 더 앞선다.

     

    참고로, orElseThrow()는 null일 경우 예외를 반환한다.

     

    참고

    https://kdhyo98.tistory.com/40

    https://giron.tistory.com/153

Designed by Tistory.