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

Что такое noneMatch?

2.2 Middle🔥 171 комментариев
#Stream API и функциональное программирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

noneMatch — проверка, что ни один элемент не соответствует условию

noneMatch — это терминальная операция Stream API, которая возвращает true, если ни один элемент потока не соответствует заданному предикату. Это противоположность methodу anyMatch.

Основная концепция

import java.util.List;
import java.util.stream.Stream;

public class NoneMatchExample {
    public static void main(String[] args) {
        List<Integer> numbers = List.of(2, 4, 6, 8, 10);
        
        // Проверка: все ли числа чётные?
        // noneMatch проверит, что НЕ ОДИН элемент не нечётный
        boolean allEven = numbers.stream()
            .noneMatch(n -> n % 2 != 0);
        
        System.out.println("All even: " + allEven); // true
    }
}

Сравнение с другими операциями

МетодВозвращает true если...Сокращение
anyMatchхотя бы один элемент соответствует
allMatchвсе элементы соответствуют
noneMatchни один элемент не соответствует¬∃
public class StreamMatchComparison {
    static List<Integer> numbers = List.of(2, 4, 6, 8, 10);
    
    public static void main(String[] args) {
        // anyMatch — хотя бы одно число > 5
        boolean hasGreaterThan5 = numbers.stream()
            .anyMatch(n -> n > 5);
        System.out.println("Has > 5: " + hasGreaterThan5); // true
        
        // allMatch — все числа > 0
        boolean allPositive = numbers.stream()
            .allMatch(n -> n > 0);
        System.out.println("All positive: " + allPositive); // true
        
        // noneMatch — ни одно число < 0
        boolean noneNegative = numbers.stream()
            .noneMatch(n -> n < 0);
        System.out.println("None negative: " + noneNegative); // true
    }
}

Практические примеры noneMatch

Проверка, что нет недействительных данных:

public class UserValidator {
    public boolean hasNoInvalidUsers(List<User> users) {
        // Проверка, что нет пользователей с пустым именем
        return users.stream()
            .noneMatch(user -> user.getName() == null || user.getName().isEmpty());
    }
    
    public boolean isValidEmail(List<User> users) {
        // Проверка, что нет пользователей без email
        return users.stream()
            .noneMatch(user -> !user.getEmail().contains("@"));
    }
}

Проверка уникальности (отсутствие дубликатов):

public class DuplicateChecker {
    public boolean hasNoDuplicates(List<String> items) {
        return items.stream()
            .noneMatch(item -> 
                items.stream()
                    .filter(i -> i.equals(item))
                    .count() > 1
            );
    }
}

Проверка отсутствия запрещённых операций:

public class SecurityValidator {
    public boolean isSecure(List<String> commands) {
        String[] forbiddenCommands = {"rm -rf", "drop table", "delete from"};
        
        return commands.stream()
            .noneMatch(cmd -> 
                java.util.Arrays.stream(forbiddenCommands)
                    .anyMatch(cmd::contains)
            );
    }
}

noneMatch с фильтрацией

public class InventoryChecker {
    public boolean noOutOfStock(List<Product> products) {
        // Проверка, что нет товаров без запасов
        return products.stream()
            .filter(p -> p.isActive()) // Фильтруем активные
            .noneMatch(p -> p.getQuantity() == 0); // Проверяем запасы
    }
    
    public boolean noExpiredItems(List<Item> items) {
        return items.stream()
            .noneMatch(item -> item.getExpiryDate()
                .isBefore(java.time.LocalDate.now()));
    }
}

noneMatch vs allMatch

Часто noneMatch можно заменить allMatch с инвертированным предикатом:

public class LogicalEquivalence {
    // Эти два выражения эквивалентны:
    
    // 1. Используем noneMatch
    boolean result1 = list.stream()
        .noneMatch(x -> x < 0);
    
    // 2. Используем allMatch с инвертированием
    boolean result2 = list.stream()
        .allMatch(x -> x >= 0);
    
    // result1 == result2
}

noneMatch и отладка

public class DebugNoneMatch {
    public static void main(String[] args) {
        List<String> items = List.of("apple", "banana", "cherry");
        
        boolean result = items.stream()
            .peek(item -> System.out.println("Checking: " + item))
            .noneMatch(item -> item.length() > 10);
        
        System.out.println("Result: " + result); // true
        // Вывод:
        // Checking: apple
        // Checking: banana
        // Checking: cherry
        // Result: true
    }
}

Производительность noneMatch

noneMatch — это short-circuiting операция, что означает, что она может завершиться раньше, если найдёт элемент, соответствующий предикату:

public class PerformanceExample {
    public static void main(String[] args) {
        List<Integer> numbers = java.util.stream.IntStream
            .range(0, 1000000)
            .boxed()
            .toList();
        
        long start = System.nanoTime();
        boolean result = numbers.stream()
            .noneMatch(n -> n == 5); // Завершится быстро!
        long duration = System.nanoTime() - start;
        
        System.out.println("Result: " + result);
        System.out.println("Duration: " + duration / 1_000_000 + "ms");
    }
}

Реальный пример из боевого кода

public class OrderValidator {
    private List<OrderItem> items;
    
    public void validateOrder() throws ValidationException {
        // Проверка, что нет товаров с отрицательным количеством
        if (!items.stream().noneMatch(item -> item.getQuantity() < 0)) {
            throw new ValidationException("Invalid item quantities");
        }
        
        // Проверка, что нет блокированных товаров
        if (!items.stream().noneMatch(item -> item.isBlocked())) {
            throw new ValidationException("Order contains blocked items");
        }
    }
}

Заключение

noneMatch — это мощный метод для проверки отсутствия элементов с определённым свойством. Он часто используется для валидации данных и проверки бизнес-правил. Благодаря short-circuiting механизму, он эффективен даже на больших потоках данных.

Что такое noneMatch? | PrepBro