← Назад к вопросам

Для чего нужен 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 оптимизации.