JDK8 에서 추가된 기능이다. Optional 이란 객체 안에 담긴 값이 존재하지 않는 경우도 있을 경우에 사용한다. 예를 들어 DB 에 있는 값을 조회할 떄 값이 존재하지 않을 가능성이 있을 수도 있으므로 Optional 을 사용할 수 있다.

orElse vs orElseGet

두 메서드 모두 Optional 의 값이 존재하지 않을 때(null) 의 값을 설정한다. 다만 둘의 차이는 파라미터로 받아온 객체의 생성 시점에 있다.

orElse()

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

orElseGet()

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

orElse 는 Optional 의 value 가 null 일 경우에 받아온 값을 그대로 반환하고, orElseGet 은 함수형 인터페이스인 Supplier 를 받아와 내부에서 get() 을 호출하여 반환한다. 즉, orElse 는 value 가 null 인지 아닌지에 관계 없이 이미 완성된 객체를 받아와 반환하며, orElseGet 은 value 가 null 일 경우에만 객체를 생성한다.

상수와 같이 이미 만들어진 값을 반환하는 경우에는 orElse 를, 새 객체를 생성해야 하는 경우에는 orElseGet 을 사용하자.