Post

Java Stream Optionals 필터링

1. Stream of Optionals

Stream of Optionals에서 비어 있지 않은 값을 필터링하는 방법이다.

모든 예에서 동일한 list를 사용한다.

1
2
List<Optional<String>> listOfOptionals = Arrays.asList(
  Optional.empty(), Optional.of("foo"), Optional.empty(), Optional.of("bar"));

2. filter() 사용

Java 8의 옵션 중 하나는 Optional::isPresent를 사용하여 값을 필터링한 다음 Optional::get 함수를 사용하여 매핑을 수행하여 값을 추출하는 것이다.

1
2
3
4
List<String> filteredList = listOfOptionals.stream()
  .filter(Optional::isPresent)
  .map(Optional::get)
  .collect(Collectors.toList());

3. flatMap() 사용

다른 옵션은 빈 Optional을 빈 Stream 인스턴스로 변환하고, 비어 있지 않은 Optional을 하나의 요소만 포함하는 Stream 인스턴스로 변환하는 람다 식과 함께 flatMap을 사용하는 것이다.

1
2
3
List<String> filteredList = listOfOptionals.stream()
  .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
  .collect(Collectors.toList());

또는 Optional을 Stream으로 변환하는 다른 방법을 사용하여 동일한 접근 방식을 적용할 수 있다.

1
2
3
List<String> filteredList = listOfOptionals.stream()
  .flatMap(o -> o.map(Stream::of).orElseGet(Stream::empty))
  .collect(Collectors.toList());

4. Java 9의 Optional::stream

Optional에 stream() 메소드를 추가하는 Java 9의 등장으로 이 모든 것이 상당히 단순화될 것이다.

이 접근 방식은 위에 표시된 것과 유사하지만 이번에는 Optional 인스턴스를 Stream 인스턴스로 변환하기 위해 미리 정의된 방법을 사용한다.

Optional 값이 있든 없든 요소가 1개 또는 0개인 스트림을 반환한다.

1
2
3
List<String> filteredList = listOfOptionals.stream()
  .flatMap(Optional::stream)
  .collect(Collectors.toList());

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.