Javaでオプションのストリームをフィルタリングする

1前書き

この記事では、 Stream of Optionals から空でない値を除外する方法について説明します。

3つの異なるアプローチを検討します。2つはJava 8を使用するもの、もう1つはJava 9の新しいサポートを使用するものです。

すべての例で同じリストに取り組んでいきます。

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

2 filter() を使う

Java 8のオプションの1つは、__Optional

isPresent を使用して値をフィルタリングしてから Optional :: get__関数を使用してマッピングを実行し、値を抽出することです。

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

3 flatMap() を使う

もう1つの選択肢は、空の Optional を空の Stream インスタンスに変換し、空でない Optional を1つの要素のみを含む Stream インスタンスに変換するラムダ式で flatMap を使用することです。

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

別の方法として、 Optional Stream に変換する別の方法を使用して同じアプローチを適用することもできます。

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の登場により、かなり単純化されます。

このアプローチはセクション3に示したものと似ていますが、今回は Optional インスタンスを Stream インスタンスに変換するための事前定義されたメソッドを使用しています。

Optional 値が存在するか存在しないかにかかわらず、1つまたは0つの要素のストリームを返します。

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

5結論

これにより、 Stream of Optionals から現在の値を除外する3つの方法がすぐにわかりました。

コードサンプルの完全な実装はhttps://github.com/eugenp/tutorials/blob/master/core-java-9/src/test/java/com/baeldung/java9/Java9OptionalsStreamUnitTest.java[Githubにあります。プロジェクト]。