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にあります。プロジェクト]。