Javaでオプションのストリームをフィルタリングする
1. 前書き
この記事では、OptionalsのStreamから空でない値を除外する方法について説明します。
3つの異なるアプローチを検討します。2つはJava8を使用し、もう1つはJava9の新しいサポートを使用します。
すべての例で同じリストに取り組んでいきます。
List> listOfOptionals = Arrays.asList(
Optional.empty(), Optional.of("foo"), Optional.empty(), Optional.of("bar"));
2. filter()の使用
Java 8のオプションの1つは、Optional::isPresentを使用して値をフィルターで除外し、Optional::get関数を使用してマッピングを実行して値を抽出することです。
List filteredList = listOfOptionals.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
3. flatMap()の使用
もう1つのオプションは、空のOptionalを空のStreamインスタンスに変換し、空でないOptionalをStreamに変換するラムダ式でflatMapを使用することです。 ■要素を1つだけ含むインスタンス:
List filteredList = listOfOptionals.stream()
.flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
.collect(Collectors.toList());
または、OptionalをStreamに変換する別の方法を使用して、同じアプローチを適用することもできます。
List filteredList = listOfOptionals.stream()
.flatMap(o -> o.map(Stream::of).orElseGet(Stream::empty))
.collect(Collectors.toList());
4. Java9のオプション::ストリーム
Optionalにstream()メソッドを追加するJava 9の登場により、これはすべて非常に単純化されます。
このアプローチはセクション3で示したものと似ていますが、今回は、OptionalインスタンスをStreamインスタンスに変換するための事前定義されたメソッドを使用しています。
Optionalの値が存在するかどうかに関係なく、1つまたは0の要素のストリームを返します。
List filteredList = listOfOptionals.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
5. 結論
これにより、OptionalsのStreamから現在価値をフィルタリングする3つの方法をすぐに確認できました。
コードサンプルの完全な実装は、Github projectにあります。