Dev

[Java] Optional map flatMap 차이점

Ryan Woo 2020. 9. 16. 16:36

Optional isPresent() 를 제거하다 보니 flatMap 을 사용해야 하는 경우도 발생하여 정리겸 블로깅.

로직에서 Optional 이 연속적으로 리턴되는 경우에 flatMap 을 사용해야 한다.
Optional map 과 flatMap 의 메서드 시그니처는 아래와 같다.

public<U> Optional<U> map(Function<? super T, ? extends U> mapper);

public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper);

차이점은 mapper function 의 리턴 타입인데 flatMap 의 경우 리턴타입이 Optional 이어야 한다.
벨덩에 좋은 예제가 있다.

assertEquals(Optional.of(Optional.of("STRING")), 
  Optional
  .of("string")
  .map(s -> Optional.of("STRING")));
  
assertEquals(Optional.of("STRING"), Optional
  .of("string")
  .flatMap(s -> Optional.of("STRING")));

출처 : www.baeldung.com/java-difference-map-and-flatmap
map() 은 결과를 Optional 로 감싸서 리턴하는 반면, flatMap() 은 그냥 반환한다.

아래는 읽어볼만한 Optional 관련 글 링크
dzone.com/articles/using-optional-correctly-is-not-optional