← Назад к вопросам
Для чего нужен allMatch?
1.6 Junior🔥 201 комментариев
#Stream API и функциональное программирование
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# allMatch в Stream API
Назначение
allMatch() — это терминальная операция Stream API, которая проверяет, удовлетворяют ли все элементы потока заданному условию (предикату). Возвращает boolean: true если все элементы соответствуют условию, false в противном случае.
Основной синтаксис
boolean result = stream.allMatch(predicate);
Предикат — это функциональный интерфейс Predicate<T>, который принимает элемент и возвращает boolean.
Примеры использования
Пример 1: Проверка числовых условий
List<Integer> numbers = Arrays.asList(2, 4, 6, 8, 10);
// Проверяем, все ли числа чётные
boolean allEven = numbers.stream()
.allMatch(n -> n % 2 == 0);
System.out.println(allEven); // true
Пример 2: Проверка условий на объектах
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() { return age; }
}
List<User> users = Arrays.asList(
new User("Alice", 25),
new User("Bob", 30),
new User("Charlie", 28)
);
// Проверяем, все ли пользователи старше 20
boolean allAdult = users.stream()
.allMatch(user -> user.getAge() > 20);
System.out.println(allAdult); // true
Пример 3: Проверка нескольких условий
List<String> emails = Arrays.asList(
"user1@gmail.com",
"user2@gmail.com",
"user3@gmail.com"
);
// Проверяем, что все email'ы содержат @
boolean validEmails = emails.stream()
.allMatch(email -> email.contains("@") && !email.isEmpty());
System.out.println(validEmails); // true
Важные особенности
1. Short-circuit операция
allMatch() — это операция **short-circuit**, то есть она может остановиться раньше, не проверяя все элементы:
List<Integer> numbers = Arrays.asList(1, 2, 3, 100, 200);
// Проверка остановится сразу же, когда найдёт нечётное число
boolean allEven = numbers.stream()
.allMatch(n -> n % 2 == 0);
System.out.println(allEven); // false
Это дает преимущество в производительности на больших коллекциях.
2. Поведение с пустым потоком
List<Integer> emptyList = new ArrayList<>();
// Пустой поток: allMatch всегда возвращает true
boolean result = emptyList.stream()
.allMatch(n -> n > 0);
System.out.println(result); // true
Это логично: если нет элементов, которые не соответствуют условию, значит все соответствуют.
Сравнение с другими методами
List<Integer> nums = Arrays.asList(2, 4, 6, 8);
// anyMatch - проверяет, есть ли хотя бы один элемент
boolean hasEven = nums.stream()
.anyMatch(n -> n % 2 == 0); // true
// noneMatch - проверяет, что ни один элемент не соответствует
boolean noOdd = nums.stream()
.noneMatch(n -> n % 2 == 1); // true
// allMatch - проверяет, что все элементы соответствуют
boolean allEven = nums.stream()
.allMatch(n -> n % 2 == 0); // true
Практическое применение
Валидация данных
public boolean isValidUserList(List<User> users) {
return users.stream()
.allMatch(user -> user.getName() != null &&
user.getAge() >= 0);
}
Проверка разрешений
public boolean canAccessResource(List<Permission> permissions) {
return permissions.stream()
.allMatch(Permission::isValid);
}
Резюме
allMatch() используется когда нужно убедиться, что каждый элемент коллекции удовлетворяет определённому условию. Это удобный, читаемый способ с преимуществом в производительности благодаря short-circuit оптимизации.