Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
ストリーム.findFirst() / anyMatch() / allMatch() / noneMatch()
ストリームから条件に合う要素を検索したり、条件を全要素が満たすかを判定したりするための終端操作です(Java 8+)。『findFirst()』は条件に合う最初の要素を、『anyMatch()』は少なくとも1つの要素が条件を満たすかを確認します。
構文
// 最初の要素を Optional で返します。 ストリーム.findFirst(); // 任意の要素を Optional で返します(並列ストリーム向け)。 ストリーム.findAny(); // いずれかの要素が条件を満たすか確認します。 ストリーム.anyMatch(要素 -> 条件); // 全要素が条件を満たすか確認します。 ストリーム.allMatch(要素 -> 条件); // どの要素も条件を満たさないか確認します。 ストリーム.noneMatch(要素 -> 条件);
メソッド一覧
| メソッド | 概要 |
|---|---|
| findFirst() | ストリームの最初の要素を Optional 型で返します。空の場合は空の Optional を返します。 |
| findAny() | ストリームのいずれかの要素を Optional 型で返します。並列ストリームで最初に見つかった要素を返します。 |
| anyMatch(Predicate) | いずれかの要素が条件を満たすか確認し、boolean 型で返します。 |
| allMatch(Predicate) | 全要素が条件を満たすか確認し、boolean 型で返します。 |
| noneMatch(Predicate) | どの要素も条件を満たさないか確認し、boolean 型で返します。 |
サンプルコード
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
// 'C' で始まる最初の名前を検索します。
Optional<String> first = names.stream()
.filter(name -> name.startsWith("C"))
.findFirst();
System.out.println(first.orElse("見つかりません")); // 『Charlie』と出力されます。
// いずれかの名前が5文字以上か確認します。
boolean hasLong = names.stream()
.anyMatch(name -> name.length() >= 5);
System.out.println(hasLong); // 『true』と出力されます(Alice, Charlie, David)。
// 全員の名前が3文字以上か確認します。
boolean allLong = names.stream()
.allMatch(name -> name.length() >= 3);
System.out.println(allLong); // 『true』と出力されます。
// 数字を含む名前がないか確認します。
boolean noDigit = names.stream()
.noneMatch(name -> name.matches(".*\\d.*"));
System.out.println(noDigit); // 『true』と出力されます(数字を含む名前はない)。
// findFirst の結果が空の場合の対処法。
Optional<String> empty = names.stream()
.filter(name -> name.startsWith("Z"))
.findFirst();
System.out.println(empty.isPresent()); // 『false』と出力されます。
概要
『findFirst()』は Optional 型を返すため、要素が見つからなかった場合も安全に処理できます。get() を直接呼び出すと要素が存在しない場合に例外がスローされるため、『orElse()』や『isPresent()』を使って安全に取得してください。
『anyMatch()』『allMatch()』『noneMatch()』はショートサーキット評価を行います。例えば anyMatch() は条件を満たす要素が1つ見つかった時点で残りの要素の評価を打ち切るため、効率的に処理できます。
Optional クラスの詳細については『Optional.of() / isPresent() / orElse()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。