Ответ
Предикат (Predicate<T>) в Java — это функциональный интерфейс из пакета java.util.function, который представляет собой булеву функцию одного аргумента. Его основной метод — boolean test(T t), который проверяет условие для переданного объекта.
Для QA-инженера, пишущего автотесты на Java, предикаты полезны для:
- Фильтрации коллекций данных, полученных в тестах (например, списка пользователей, логов, элементов UI).
- Создания гибких условий проверок (assertions).
- Чтения и написания чистого, декларативного кода в связке со Stream API.
Пример 1: Базовое использование
import java.util.function.Predicate;
// Предикат, проверяющий, что строка не null и не пуста
Predicate<String> isNotEmpty = s -> s != null && !s.isEmpty();
System.out.println(isNotEmpty.test("")); // false
System.out.println(isNotEmpty.test("Hello QA")); // true
Пример 2: Фильтрация в автотесте (например, поиск определённых товаров в списке)
import java.util.List;
import java.util.stream.Collectors;
List<Product> allProducts = productService.getAllProducts();
// Предикат для поиска товаров, находящихся в наличии и дороже 1000
Predicate<Product> isAvailableAndExpensive = p -> p.isInStock() && p.getPrice() > 1000.0;
List<Product> filteredProducts = allProducts.stream()
.filter(isAvailableAndExpensive)
.collect(Collectors.toList());
// Проверяем, что отфильтрованный список не пуст
assertFalse(filteredProducts.isEmpty(), "Должны найтись подходящие товары");
Пример 3: Комбинирование предикатов
Predicate<Integer> isPositive = x -> x > 0;
Predicate<Integer> isEven = x -> x % 2 == 0;
// Число должно быть положительным И чётным
Predicate<Integer> isPositiveAndEven = isPositive.and(isEven);
System.out.println(isPositiveAndEven.test(4)); // true
System.out.println(isPositiveAndEven.test(-2)); // false
System.out.println(isPositiveAndEven.test(3)); // false
Использование Predicate делает код условий в тестах более модульным и переиспользуемым.