Java8에서 지원하는 Optional에서 orElse, orElseGet, orElseThrow를 쓰다보면 비슷한 점이 많아 햇갈릴 때가 많다. 이번기회에 간략히 정리해보자
public T orElse(T other) {
return value != null ? value : other;
}
Optinal의 value값이 null이 아니라면 그대로 value 반환하고, 그렇지 않으면 other(값)를 반환한다.
public T orElseGet(Supplier<? extends T> supplier) {
return value != null ? value : supplier.get();
}
Optinal value 값이 null이 아니면 value를 반환해주는건 orElse와 같다.
다만, orElseGet은 null일때 함수로 넘어가는 점이 다르다. (supplier.get)
두개가 있는걸 이제 알았다.
// 첫번째
public T orElseThrow() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
첫번째 orElseThrow는 Optional의 value가 없다면 NoSuchElementException 예외를 발생시킨다.
값이나 함수로 넘어가지 않고 예외를 발생시키는 점이 다르다.
// 두번째
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
두번째 orElseThrow는 Optional의 value가 없다면 '내가 넘긴 파라미터 예외로' 예외를 발생시킨다.
이 예외는 함수로 호출한다.
함수로 넘어가되, 사용자 지정 예외(?)로 예외를 발생시킨다.
틀린 부분이 있다면 피드백 부탁드립니다!