anyMatch / allMatch / noneMatch — 条件検査
Stream API の終端操作である anyMatch / allMatch / noneMatch は、ストリームの要素が「条件を満たすかどうか」をチェックするための便利なメソッドです。
SQL の EXISTS や ALL、NOT EXISTS に近いイメージで、要素の存在判定に使います。
基本の役割
- anyMatch(predicate):
→ 1つでも条件を満たす要素があればtrue。
→ 「ひとつでもあるか?」のチェック。 - allMatch(predicate):
→ 全ての要素が条件を満たせばtrue。
→ 「全部そうか?」のチェック。 - noneMatch(predicate):
→ どの要素も条件を満たさなければtrue。
→ 「ひとつもないか?」のチェック。
基本コード例
anyMatch(偶数があるか?)
List<Integer> nums = List.of(1,3,5,7,8);
boolean hasEven = nums.stream().anyMatch(n -> n % 2 == 0);
System.out.println(hasEven); // true (8が偶数)
JavaallMatch(全員合格か?)
List<Integer> scores = List.of(70, 80, 90);
boolean allPassed = scores.stream().allMatch(s -> s >= 60);
System.out.println(allPassed); // true (全員60以上)
JavanoneMatch(不合格者がいないか?)
List<Integer> scores = List.of(70, 80, 90);
boolean noFail = scores.stream().noneMatch(s -> s < 60);
System.out.println(noFail); // true (不合格者なし)
Java例題で理解する
例題1: ログに ERROR が含まれるか?
List<String> logs = List.of("INFO start","WARN retry","ERROR failed");
boolean hasError = logs.stream().anyMatch(l -> l.contains("ERROR"));
System.out.println(hasError); // true
Java例題2: 学生全員が合格しているか?
record Student(String name, int score) {}
List<Student> students = List.of(
new Student("Tanaka",80),
new Student("Sato",55),
new Student("Ito",90)
);
boolean allPassed = students.stream().allMatch(s -> s.score >= 60);
System.out.println(allPassed); // false (Satoが不合格)
Java例題3: 商品リストに「在庫切れ」がひとつもないか?
record Product(String name, boolean inStock) {}
List<Product> products = List.of(
new Product("A", true),
new Product("B", true),
new Product("C", false)
);
boolean noneOutOfStock = products.stream().noneMatch(p -> !p.inStock());
System.out.println(noneOutOfStock); // false (Cが在庫切れ)
Javaテンプレート集
- ひとつでも条件を満たすか?
boolean exists = stream.anyMatch(x -> 条件);
Java- 全員が条件を満たすか?
boolean allOk = stream.allMatch(x -> 条件);
Java- 誰も条件を満たさないか?
boolean noneOk = stream.noneMatch(x -> 条件);
Java⚖️ 落とし穴と回避策
- 空ストリーム:
- anyMatch → false
- allMatch → true(全員条件を満たすとみなす vacuous truth)
- noneMatch → true(誰も満たさないとみなす)
→ 空の場合の挙動を理解しておくこと。
- 副作用を入れない: predicate 内で外部変数を書き換えるのは避ける。純粋な条件判定に徹する。
- 並列ストリーム: anyMatch/noneMatch は「短絡評価」で効率的に終了する。大量データでも高速。
まとめ
- anyMatch: 「ひとつでもある?」
- allMatch: 「全部そう?」
- noneMatch: 「ひとつもない?」
- 空ストリームの挙動に注意しつつ、存在判定や条件検査に使うとコードが簡潔になる。
👉 練習課題: 「社員リストから年齢が30以上の人がひとりでもいるか?」「全員が正社員か?」「誰も退職予定でないか?」を anyMatch / allMatch / noneMatch で書いてみると理解が深まります。
