Как проверить, что все элементы подходят под условие
Короткий ответ
allMatch() возвращает true, если условие выполняется для каждого элемента:
void main() {
var ages = List.of(21, 34, 19);
IO.println(ages.stream().allMatch(age -> age >= 18));
IO.println(ages.stream().allMatch(age -> age >= 20));
}Результат:
true
falseХотя бы один и ни одного
anyMatch() проверяет, что подходит хотя бы один элемент, noneMatch() — что не подходит ни один:
void main() {
var passwords = List.of("secret1", "qwerty", "Tr0ub4dor");
IO.println(passwords.stream().anyMatch(p -> p.length() > 8));
IO.println(passwords.stream().noneMatch(String::isBlank));
}Результат:
true
trueОстановка на первом ответе
Эти методы прекращают проверку, как только ответ известен:
void main() {
boolean result = Stream.of(1, 2, 3, 4)
.peek(n -> IO.println("checking " + n))
.allMatch(n -> n < 2);
IO.println(result);
}Результат:
checking 1
checking 2
falseЧастая ошибка
Забыть про пустой список. allMatch() для пустого потока возвращает true, а anyMatch() — false:
void main() {
List<Integer> empty = List.of();
IO.println(empty.stream().allMatch(n -> n > 100));
IO.println(empty.stream().anyMatch(n -> n > 100));
}Результат:
true
falseЕсли пустой список должен давать false, проверьте !list.isEmpty() отдельно.
Функции из этого ответа
- Stream.allMatch() — Проверяет, подходят ли под условие все элементы.
- Stream.anyMatch() — Проверяет, подходит ли под условие хотя бы один элемент.
- Stream.noneMatch() — Проверяет, что ни один элемент не подходит под условие.