orElse() vs orElseGet()

초코파이·2021년 2월 10일
0
orElse(T ob)
orElse(Supplier<? extends T> ob)

Optional 객체 값에 접근하기 위해서는 get, orElse, orElseGet, orElseThrow를 쓸 수 있다. 난 orElse와 orElseGet의 차이에 대해 알아 봤다.

우선 두 메소드 모두 마치 if문을 대신해서 쓸 수 있다. 객체가 가지고 있는 값이 null일 경우 무슨 값으로 대체해 return할지를 매개값으로 넘겨준다. 둘이 다른점은 파라미터이다. orElse는 객체를 그대로 return 하는데 orElseGet은 Supplier 메소드를 받아서 return 한다.

Supplier?
함수적 인터페이스 API 종류 중 하나이다. 매개값은 없고 리턴값만 있이 람다식을 사용할 수 있다.

public static void main(String[] args) { 
	String check = "Hi";
    	String result = Optional.ofNullable(check).orElse(testFunction());
        System.out.println("첫번째: "+result);
        String result02 = Optional.ofNullable(check).orElseGet(()->testFunction());
        System.out.println("두번째: "+result02);
}
public static String testFunction(){
        System.out.println("testFunction() 실행");
        return "강아지";
}

출력 결과는

testFunction() 실행
첫번째: Hi
두번째: Hi

이다. testFunction()가 실행되는 이유는 간단하다. 값으로 메소드를 넘겨주었기 때문이다. orElse()는 메소드의 return값을 객체로 본다. 그래서 일단 메소드를 실행 시킨 것이다. orElseGet()의 경우 메소드의 실행 시점은 객체가 null일 경우니 orElseGet의 파라미터인 메소드는 실행이 안 되는 게 당연하다.

testFunction() 실행
첫번째: 강아지
testFunction() 실행
두번째: 강아지

check에 null을 주면 이런 결과가 나온다.

결론적으로 둘이 메소드를 파라미터로 넘길 때 실행시점에서 차이가 발생한다. orElse()는 Optional 객체가 null이어도 메소드가 실행되고, orElseGet은 실행되지 않는다. 끝.

profile
열심히 흡수하기

0개의 댓글