Ответ
Предикат (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 делает код условий в тестах более модульным и переиспользуемым.
Ответ 18+ 🔞
Слушай, давай разжую тебе про этот Predicate<T>, чтобы ты, как QA, не ломал голову. Это, по сути, такая хитрая жопа из пакета java.util.function, которая умеет говорить "да" или "нет" про любой объект. Внутри у неё один главный метод — boolean test(T t). Кидаешь ему что-нибудь, а он тебе вернёт, прошла эта штука проверку или нет. Пиздец как удобно.
Тебе, как тестировщику, это нахуй не сдалось? Как бы не так! Пригодится для:
- Отсева мусора из данных в тестах. Допустим, натащил кучу пользователей или логов — предикатом отфильтруешь только нужных.
- Создания умных и гибких проверок (assertions), чтобы не писать километровые
if. - Чистого кода, особенно когда работаешь со Stream API. Выглядит солидно, да и по факту удобно.
Пример 1: Банальщина, но надо понять суть
import java.util.function.Predicate;
// Предикат, который орёт: "Строка не пустая, ёпта!"
Predicate<String> isNotEmpty = s -> s != null && !s.isEmpty();
System.out.println(isNotEmpty.test("")); // false — ну ясное дело
System.out.println(isNotEmpty.test("Hello QA")); // true — вот это дело
Пример 2: Реальная задача из теста (например, отфильтровать товары) Представь, получил ты список всех товаров. Надо найти только те, что в наличии и дороже 1000. Без предиката писал бы цикл, а тут — красота.
import java.util.List;
import java.util.stream.Collectors;
List<Product> allProducts = productService.getAllProducts();
// Вот наш охранник, который пропускает только "богатых и доступных"
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); // Волшебный метод `.and()`
System.out.println(isPositiveAndEven.test(4)); // true — идеал
System.out.println(isPositiveAndEven.test(-2)); // false — отрицательное, пошло нахуй
System.out.println(isPositiveAndEven.test(3)); // false — нечётное, тоже мимо
Короче, Predicate — это твой верный пёс для отлова нужных данных в тестах. Код с ним становится читабельнее, а логику проверок можно переиспользовать, что овердохуища экономит время. Освой эту тему, и твои автотесты станут на уровень выше, чувак.