Java 逆引き集 | anyMatch/allMatch/noneMatch — 条件検査

Java Java
スポンサーリンク

anyMatch / allMatch / noneMatch — 条件検査

Stream API の終端操作である anyMatch / allMatch / noneMatch は、ストリームの要素が「条件を満たすかどうか」をチェックするための便利なメソッドです。
SQL の EXISTSALLNOT 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が偶数)
Java

allMatch(全員合格か?)

List<Integer> scores = List.of(70, 80, 90);

boolean allPassed = scores.stream().allMatch(s -> s >= 60);
System.out.println(allPassed); // true (全員60以上)
Java

noneMatch(不合格者がいないか?)

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 で書いてみると理解が深まります。

タイトルとURLをコピーしました