findAny
、findFirst
は、探索した要素をOptional<T>
として返す終端操作です。
メソッド | 説明 |
---|---|
Optional findAny() | ストリームのいずれかの要素を含むOptionalまたは空のOptional(ストリームが空の場合)を返す。(常に同じ要素が返される保証はない。) |
Optional findFirst() | ストリーム最初の要素を含むOptionalまたは空のOptional(ストリームが空の場合)を返す。 |
findAny
は、常に同じ要素が返される保証はないとされています。
なので、例えば並列処理などで処理した結果のうち、何でもよいから1個欲しい。といった場合にfindAny
を用います。
Java
IntStream.of(1, 3, 4)
.map(n -> n*2)
.parallel()
.findAny()
.ifPresent(System.out::println);
実行結果
6
findFirst
は、filter
を組み合わせるとその威力を発揮します。
例えば、filter
でストリーム要素の条件判定を行い、一番最初にtrue
判定になった要素を取得したい場合にfindFirst
を用います。
filter
の使い方を忘れてしまった方は以下の記事をご確認ください!
Java
//List生成
List<Integer> list = Arrays.asList(7, 10, 12, 9, 31);
//filterのメイン処理
Predicate<Integer> p = n -> {
System.out.print("これから" + n + "を判定します。");
boolean result = n > 10;
System.out.println("判定結果は" + result + "です。");
return result;
};
//ListをStream化し、filterを実行。
list.stream()
.filter(p)
.findFirst()
.ifPresent(x -> System.out.println("findFirst()で取得した値:" + x));
実行結果
これから7を判定します。判定結果はfalseです。
これから10を判定します。判定結果はfalseです。
これから12を判定します。判定結果はtrueです。
findFirst()で取得した値:12
filter
で一番最初にtrue
判定となった要素「12」をfindFirst
で取得することができました。
以上で記事の解説はお終い!
もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!