Streamの find 関数 findFirst(), findAny() と、match 関数anyMatch(), allMatch(), noneMatch() について紹介します。
1. find 関数: findFirst(), findAny()
Stream の find 関数には findFirst() と findAny() があります。
これらの2つの関数はすべて、ストリーム内の任意のオブジェクトを見つけてオブジェクトを返すという共通点があります。
違いは、 findFisrt() はストリームの順序を考慮して一番前にあるものを返し、 findAny() は Stream の順序とは無関係に最初に探索されたオブジェクトを返します。
1.1 シングルスレッドで find 関数を使う
以下の例では、 findFirst() と findAny() を使って特定のオブジェクトを見つけます。どちらの関数も同じオブジェクト b を返します。
ストリームがシングルスレッドで動作するため、リストの順にナビゲートするので、 b1 より b を先に探すからです。
List<String> elements =
        Arrays.asList("a", "a1", "b", "b1", "c", "c1");
Optional<String> firstElement = elements.stream()
        .filter(s -> s.startsWith("b")).findFirst();
Optional<String> anyElement = elements.stream()
        .filter(s -> s.startsWith("b")).findAny();
firstElement.ifPresent(System.out::println);
anyElement.ifPresent(System.out::println);Output:
b
bシングルスレッドでは findAny() と findFirst() に大きな違いはありません。マルチスレッドでこれらの関数を使用すると、返される結果の違いが簡単に見えます。
1.2 マルチスレッドでの find 関数の使用
Stream.parallel() は、Stream がマルチスレッドで並列に実行されるようにします。つまり、マルチスレッドでストリームのデータを探索しながら filter() が行われ、ストリームのデータ順序と異なって探索が発生することがあります。 (つまり、次の例では、 bよりも b1を最初に検索できることを意味します)
以下の例では、 findAny() は b1 または b の中で最初に探索されたものを返します。つまり、 b1 が最初に探索されると b1 が返されます。
しかし、 findFirst() を使う場合、 b1 が先に探索されたとしても、ストリームの順序を考慮して、一番前にあるオブジェクト b を返します。
List<String> elements =
        Arrays.asList("a", "a1", "b", "b1", "c", "c1");
firstElement = elements.stream().parallel()
        .filter(s -> s.startsWith("b")).findFirst();
anyElement = elements.stream().parallel()
        .filter(s -> s.startsWith("b")).findAny();Output:
b
b12. match クラス: anyMatch()、allMatch()、noneMatch()
match 関数は Stream でどのオブジェクトが存在するかを探索し、boolean タイプで結果を返します。
match 関数には anyMatch(), allMatch(), noneMatch() があります。
関数の特徴と戻り値は次のとおりです。
- anyMatch()は、条件に合致するオブジェクトが 1 つでもあれば true でなければ false
- allMatch()は、すべてのオブジェクトが条件を満たさなければ true でなければ false
- noneMatch()は逆に条件に適合するオブジェクトがあってはいけません true でなければ false
次のようにmatch関数を使用できます。
List<String> elements =
        Arrays.asList("a", "a1", "b", "b1", "c", "c1");
boolean anyMatch
        = elements.stream().anyMatch(s -> s.startsWith("b"));
System.out.println("anyMatch: " + (anyMatch ? "true" : "false"));
boolean allMatch
        = elements.stream().allMatch(s -> s.startsWith("b"));
System.out.println("allMatch: " + (allMatch ? "true" : "false"));
boolean noneMatch
        = elements.stream().noneMatch(s -> s.startsWith("b"));
System.out.println("noneMatch: " + (noneMatch ? "true" : "false"));Output:
anyMatch: true
allMatch: false
noneMatch: falseRelated Posts
- Java - AtomicReference使用方法
- Java - CountDownLatchを使用する方法、および例
- Java - ScheduledThreadPoolExecutor使用方法
- Java - SummaryStatisticsの使用方法(count、min、max、average)
- Java8 - 関数型インタフェース (Functional Interface) について
- Java - String配列をint配列に変換する
- Java - ArrayList要素の値を変更する方法、replaceAll()
- Java - 2つのリストが同じかどうかを比較
- Java - 配列から特定のIndex要素を削除する3つの方法
- Java - HashMapソート、4つの方法
- Java - 文字列を配列に変換する方法
- Java - ArrayListが空であることを確認する3つの方法
- Java - ArrayListの巡回、4つの方法
- Java - ArrayListの最大値、最小 値を見つける
- Java - ArrayListの合計、平均値の計算
- Java - HashMap巡回、3つの方法
- Java - do whileとwhileの違い
- Java - Lambda式と関数型インタフェース
- Java - List empty(null)チェック、3つの方法
- Java - ArrayListの初期化、4つの方法
- Java - Stream.reduce()の使い方と例
- Java - 2つのマップを結合する(merge、putAll)
- Java - java.util.Dateをjava.sql.Dateに変換する
- Java - ArrayListをStringに変換する
- Java - ClassNotFoundExceptionの発生原因と解決策
- Java - 非静的メソッドは静的コンテキストから参照できません
- Java - NoSuchMethodErrorの原因と解決策
- Java - JSONライブラリを使用する方法(JSONObject、JSONArray)
- Java - byte[]配列をFileに保存
- Java - byte[]の配列をStringに変換
- Java - ファイルのアクセス権を確認し、変更
- Java - 一時フォルダ(Temp directory)パスを取得する
- Javaでシェルスクリプトを実行
- Java - Streamを配列に変換する
- Java - リスト重複排除、2つの方法