Что такое noneMatch?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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 механизму, он эффективен даже на больших потоках данных.