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();
}
댓글남기기