Java8のStream APIの使い方(終端操作編① - anyMatch, allMatch, noneMatch)

スポンサーリンク

Stream API 終端操作のうち条件判定系のanyMatch allMatch noneMatchについてまとめました。

anyMatch:判定(一部合致)

anyMatchメソッドは filter メソッドでも使われる、判定を行うための関数型インターフェースであるPredicate<T>を引数に取り、boolean(1つでも条件に合致する値があれば true)を返します。条件に合致する値が見つかった時点で処理を終了するので||と同等です。

anyMatchの使い方

String の Collection から文字列を検索するサンプルです。

List<String> strs = Arrays.asList("hoge", "fuga", "bars");

// ラムダ式
boolean b = strs.stream().anyMatch(s -> s.equals("fuga"));
System.out.println(b);

// 匿名クラス
boolean b = strs.stream().anyMatch(new Predicate<String>() {
    @Override
    public boolean test(String t) {
        return t.equals("fuga");
    }
});

// 実行結果
true

空Streamの場合は false を返します。特に問題ないですね。

boolean c = Stream.empty().anyMatch(s -> s.equals("fuga"));
System.out.println(c);

// 実行結果
false

allMatch : 判定(全て合致)

allMatchメソッドは関数型インターフェースであるPredicate<T>を引数に取り、boolean(全て条件に合致する値であれば true)を返します。条件に合致しない値が見つかった時点で処理を終了するので&&ど同等です。

allMatchの使い方

String の Collection から文字数を判定するサンプルです。

private static boolean isCheckLength(Stream<String> s) {
    return s.allMatch(str -> str.length() == 4);
}
...
List<String> strs = Arrays.asList("hoge", "fuga", "bars");
System.out.println(isCheckLength(strs.stream()));

// 実行結果
true

空Streamの場合は true を返します。どうしてこうなった...?

private static boolean isCheckLength(Stream<String> s) {
    return s.allMatch(str -> str.length() == 4);
}
...
System.out.println(isCheckLength(Stream.empty()));

// 実行結果
true

noneMatch : 判定(全て非合致)

nonMatchメソッドは関数型インターフェースであるPredicate<T>を引数に取り、boolean(条件に合致する値が一つも無かったら true)を返します。条件に合致する値が見つかった時点で処理を終了します。

noneMatchの使い方

String の Collection から文字列を検索するサンプルです。

List<String> strs = Arrays.asList("hoge", "fuga", "bars");
boolean d = strs.stream().noneMatch(s -> s.equals("foo"));
System.out.println(d);

// 実行結果
true

空Streamの場合は true を返します。特に問題ないですね。

boolean d = Stream.empty().noneMatch(s -> s.equals("foo"));
System.out.println(d);

// 実行結果
true

空Streamの判定に関して、anyMatchnoneMatchは分かるんですが、allMatchが true を返すのはどうしてなんでしょうか。

Predicate<T>の詳細な使い方は  Java8のStream APIの使い方(中間操作編① - filter, map) の filter を参照してください。

関連記事

 Java8のforEachを使った繰り返し処理について - TASK NOTES

 Java8ラムダ式の使い方の基本 - TASK NOTES

 Java8のStream APIの使い方(Streamの生成編)

 Java8のStream APIの使い方(中間操作編① - filter, map)

 Java8のStream APIの使い方(中間操作編② - flatMap, distinct, limit, skip)

 Java8のStream APIの使い方(中間操作編③ - sorted, peek)