orElse, orElseGet, orElseThrow 에 대해서

동철·2023년 9월 4일
0

Java8에서 지원하는 Optional에서 orElse, orElseGet, orElseThrow를 쓰다보면 비슷한 점이 많아 햇갈릴 때가 많다. 이번기회에 간략히 정리해보자

Optional의 orElse

public T orElse(T other) {
	return value != null ? value : other;
}

Optinal의 value값이 null이 아니라면 그대로 value 반환하고, 그렇지 않으면 other(값)를 반환한다.

Optional의 orElseGet

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

Optinal value 값이 null이 아니면 value를 반환해주는건 orElse와 같다.
다만, orElseGet은 null일때 함수로 넘어가는 점이 다르다. (supplier.get)

Optional의 orElseThrow

두개가 있는걸 이제 알았다.

// 첫번째
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가 없다면 '내가 넘긴 파라미터 예외로' 예외를 발생시킨다.
이 예외는 함수로 호출한다.
함수로 넘어가되, 사용자 지정 예외(?)로 예외를 발생시킨다.

틀린 부분이 있다면 피드백 부탁드립니다!

profile
세상에 기여하는 사람이 되고 싶습니다.

0개의 댓글