Java Optional orElse와 orElseGet 차이

orElse

​ 값의 empty 여부와 관계없이 일단 호출되며, 값이 empty이면 입력된 값으로 반환해준다. ※ (1) 라인과 결과 (A) 참고

​ (3) 라인의 temp.orElse(…)이 호출 되기전에 callMethod(“orElse”)가 먼저 호출된다. ※ 결과 (B) 참고

orElseGet

​ empty일 경우에만 호출되며, 값이 empty이면 입력된 값으로 반환해준다. ※ (2) 라인과 결과 (A) 참고

​ (4) 라인의 temp.orElseGet(…)이 호출되고 callMethod2가 호출된다. ※ 결과 (B) 참고

결론

null 등의 empty 상태일 때 특정 값을 반환하게 해야 한다면 orElseGet을 사용해야 된다.

orElse과 orElseGet는 호출되는 순서도 다르니 상황에 맞게 선택하여 사용해야 한다.

void test() {
    Optional<String> temp = Optional.of("hello");  // 값이 있는 경우

    Supplier<String> callMethod2 = () -> {
        System.out.println(">>> orElseGet");
        return "orElseGet";
    };

    System.out.println(temp.orElse(callMethod("orElse")));  // (1)
    System.out.println(temp.orElseGet(callMethod2));  // (2)

}

private String callMethod(String s) {
    System.out.println(">>> " + s);
    return s;
}

/* 결과 (A)
>>> orElse
hello
hello
*/
void test() {
    Optional<String> temp = Optional.empty();  // 빈 값일 경우

    Supplier<String> callMethod2 = () -> {
        System.out.println(">>> orElseGet");
        return "orElseGet";
    };

    System.out.println(temp.orElse(callMethod("orElse"))); // (1)
    System.out.println(temp.orElseGet(callMethod2)); // (2)

}

private String callMethod(String s) {
    System.out.println(">>> " + s);
    return s;
}

/* 결과 (B)
>>> orElse
orElse
>>> orElseGet
orElseGet
*/
public T orElse(T other) {
	return value != null ? value : other;
}
    
public T orElseGet(Supplier<? extends T> supplier) {
	return value != null ? value : supplier.get();
}

댓글남기기