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