Java 9에서 Optional 클래스에 새롭게 추가된 ifPresentOrElse() 메서드는 Consumer와 Runnable, 두 개의 매개변수를 받는다는 점이 가장 큰 개선 사항입니다.
ifPresentOrElse() 메서드의 목적
이 메서드의 핵심 목적은 다음과 같습니다. Optional 객체에 값이 존재하면, 해당 값에 대해 지정된 동작을 실행합니다. 즉, action.accept(value)가 호출되며, 이 부분은 기존의 ifPresent() 메서드와 동일하게 작동합니다.
그렇다면 ifPresent()와의 차이점은 무엇일까요? 바로 두 번째 매개변수인 emptyAction의 존재입니다. 만약 Optional에 값이 없다면, ifPresentOrElse() 메서드는 빈 동작인 emptyAction.run()을 호출합니다. 덕분에 값의 유무에 따라 분기 처리를 별도의 if문 없이 한 줄로 깔끔하게 작성할 수 있습니다.
메서드 시그니처(구문)
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
- action: 값이 존재할 때 실행할 Consumer 람다 표현식
- emptyAction: 값이 존재하지 않을 때 실행할 Runnable 람다 표현식
사용 예제
import java.util.Optional;
public class IfPresentOrElseMethodTest {
public static void main(String args[]) {
Optional<Integer> optional = Optional.of(1);
optional.ifPresentOrElse(x -> System.out.println("Value: " + x), () ->
System.out.println("Not Present"));
optional = Optional.empty();
optional.ifPresentOrElse(x -> System.out.println("Value: " + x), () ->
System.out.println("Not Present"));
}
}실행 결과
Value: 1 Not Present
위 예제에서 첫 번째 호출은 Optional.of(1)로 값이 존재하므로 "Value: 1"이 출력되고, 두 번째 호출은 Optional.empty()로 값이 비어 있으므로 "Not Present"가 출력됩니다. 이처럼 ifPresentOrElse()를 활용하면 값의 존재 여부에 따른 처리 로직을 간결하고 가독성 있게 구현할 수 있습니다.