当サイトは、アフィリエイト広告を利用しています
jav8のstreamAPIを使って配列やCollectionのArrayListなど
から対象の値やオブジェクトを検索するメソッドの要点と使い方をまとめる。
下記の本では streamAPI についても詳しく書いてありおススメです!
また当ブログで紹介しているjava8のstreamAPIを使った
コレクションや配列の操作方法を
下記記事でメソッド別にまとめています!
findFirstメソッドはStreamの終端処理であり、値を探すメソッドではなく
探した結果の最初の値を返却するメソッド。
基本的にはStreamのfilter処理などと一緒に使うことになる。
実際にStream処理の中で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("検索結果なし"));}}
findFirstはOptionalで値を返すため、格納順、昇順、降順パターンではorElseを使っている。
使わない場合は結果なしパターンのようにOptionalで受ける必要がある
Optional型の扱いについては下記記事で紹介しています
Streamのsortについては下記で紹介してます!
findAnyメソッドもfindFirstと同様にStreamの終端処理であり、Streamを直列に処理した時の動作は
findFirstと同じになる。
Streamを並列で処理したときに動作が異なる。
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");}}
毎回、「あ~あのメソッドなんだっけ?、findはjavascriptのほうか、javaでは...」
となってググってるので今回整理してみた。
整理してみると使い方や目的が違うことがわかったのでこれからは混乱しなくて済みそう
下記を参考にさせていただきました。