当サイトは、アフィリエイト広告を利用しています

【java8】findfirst,findAnyメソッド使い方

作成日:2022月07月28日
更新日:2023年12月14日

jav8のstreamAPIを使って配列やCollectionのArrayListなど
から対象の値やオブジェクトを検索するメソッドの要点と使い方をまとめる。

下記の本では streamAPI についても詳しく書いてありおススメです!

また当ブログで紹介しているjava8のstreamAPIを使った
コレクションや配列の操作方法を
下記記事でメソッド別にまとめています!

findFirstメソッド

findFirstメソッドはStreamの終端処理であり、値を探すメソッドではなく
探した結果の最初の値を返却するメソッド。
基本的にはStreamのfilter処理などと一緒に使うことになる。

findFirstメソッドを使ってみる。

実際にStream処理の中でfindFirstメソッドを使ってみる

findFirst
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.*;
public class Main {
public static void main(String[] args) throws Exception {
// 検索対象となるListを生成
List<Person>listA = new ArrayList<>();
for(int i=0;i<5;i++){
Person pobj = new Person(i,"Name"+i,"東京"+i,i + 10);
listA.add(pobj);
}
// 同nameのオブジェクト追加
listA.add(new Person(99,"Name2","東京",99));
// 検索対象出力
System.out.println("【検索対象】");
System.out.println(listA);
System.out.println("\n");
// 格納順に検索
Person targetPerson = listA.stream()
.filter(p->"Name2".equals(p.getName())).findFirst().orElse(null);
System.out.println("【結果(格納順)】");
System.out.println(targetPerson);
System.out.println("\n");
// idで昇順ソートして検索
Person targetPersonAsc = listA.stream()
.filter(p->"Name2".equals(p.getName()))
.sorted(Comparator.comparing(Person::getId,Comparator.naturalOrder()))
.findFirst().orElse(null);
System.out.println("【結果(昇順ソート)】");
System.out.println(targetPersonAsc);
System.out.println("\n");
// idで降順ソートして検索
Person targetPersonDesc = listA.stream()
.filter(p->"Name2".equals(p.getName()))
.sorted(Comparator.comparing(Person::getId,Comparator.reverseOrder()))
.findFirst().orElse(null);
System.out.println("【結果(降順ソート)】");
System.out.println(targetPersonDesc);
System.out.println("\n");
// 検索結果なし
Optional<Person> targetPersonNull = listA.stream()
.filter(p->"Name999".equals(p.getName()))
.sorted(Comparator.comparing(Person::getId,Comparator.reverseOrder()))
.findFirst();
System.out.println("【結果なし】");
// 検索結果がないため実行されない
targetPersonNull.ifPresent(f -> System.out.println("検索結果なし"));
}
}
  • Streamのfilterで検索して最初の1件目を取得する
  • 昇順、降順にソートしてから実行すると取得できる値が変わる。
  • 取得できなかった場合はnullを返す。※格納順、昇順、降順パターンの場合
  • 結果をOptionalで受け取る ※結果なしパターン

注意

findFirstはOptionalで値を返すため、格納順、昇順、降順パターンではorElseを使っている。
使わない場合は結果なしパターンのようにOptionalで受ける必要がある

Optional型の扱いについては下記記事で紹介しています

実行して確認

【java8】findFirst

Streamのsortについては下記で紹介してます!

findAnyメソッド

findAnyメソッドもfindFirstと同様にStreamの終端処理であり、Streamを直列に処理した時の動作は
findFirstと同じになる。
Streamを並列で処理したときに動作が異なる。

findAnyメソッドを使ってみる。

findAnyメソッドを直列と並列で使ってみる

findAny
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.*;
public class Main {
public static void main(String[] args) throws Exception {
// 検索対象となるListを生成
List<Person>listA = new ArrayList<>();
for(int i=0;i<5;i++){
Person pobj = new Person(i,"Name"+i,"東京"+i,i + 10);
listA.add(pobj);
}
// 同nameのオブジェクト追加
listA.add(new Person(99,"Name2","東京",99));
// 検索対象出力
System.out.println("【検索対象】");
System.out.println(listA);
System.out.println("\n");
// 直列Streamで検索
Person targetPerson = listA.stream()
.filter(p->"Name2".equals(p.getName())).findAny().orElse(null);
System.out.println("【結果(直列Stream)】");
System.out.println(targetPerson);
System.out.println("\n");
// 並列Streamで検索
Person targetPersonPra = listA.stream().parallel()
.filter(p->"Name2".equals(p.getName())).findAny().orElse(null);
System.out.println("【結果(並列Stream)】");
System.out.println(targetPersonPra);
System.out.println("\n");
}
}
  • 直列Streamの場合は返される結果はfindFirstと同じで一定になる
  • 並列Streamの場合は返される結果は実行する度に異なる。
    ※この例の場合は最後尾に検索対象があるため、最後尾の値が検索結果になる

実行して確認

【java8】findAny

まとめ

毎回、「あ~あのメソッドなんだっけ?、findはjavascriptのほうか、javaでは...」
となってググってるので今回整理してみた。
整理してみると使い方や目的が違うことがわかったのでこれからは混乱しなくて済みそう

参考

下記を参考にさせていただきました。

新着記事

タグ別一覧
top