Ответ
Predicate<T> — это функциональный интерфейс в Java (пакет java.util.function), который представляет собой булеву функцию одного аргумента. Он используется для проверки условия и возвращает true или false.
Основной метод:
boolean test(T t)
Пример создания и использования:
import java.util.function.Predicate;
Predicate<String> isEmpty = String::isEmpty;
Predicate<String> isLong = s -> s.length() > 10;
System.out.println(isEmpty.test("")); // true
System.out.println(isLong.test("Hello World")); // true
Комбинация предикатов (default-методы):
Predicate<String> isLongAndNotEmpty = isLong.and(isEmpty.negate());
System.out.println(isLongAndNotEmpty.test("Hello")); // false (не длинный)
System.out.println(isLongAndNotEmpty.test("Hello World!")); // true
Практическое применение в Stream API:
import java.util.List;
import java.util.Arrays;
List<String> names = Arrays.asList("Anna", "Bob", "Alexander", "Kate");
Predicate<String> startsWithA = s -> s.startsWith("A");
Predicate<String> isShort = s -> s.length() <= 3;
// Фильтрация: имена, начинающиеся на 'A' ИЛИ короткие (<=3 символа)
names.stream()
.filter(startsWithA.or(isShort))
.forEach(System.out::println); // Вывод: Anna, Bob, Alexander
Зачем это нужно? Predicate инкапсулирует условие в объект, что позволяет легко передавать, комбинировать и повторно использовать логику проверок, особенно в API для фильтрации коллекций и потоков данных.
Ответ 18+ 🔞
А, блядь, смотри-ка, что у нас тут! Опять эти ваши интерфейсы с мудрёными названиями. Ну, Predicate<T>, говоришь? Да это же просто, как три копейки, ёпта!
Представь себе такого охранника на входе в клуб, сука. У него одна задача — смотреть на тебя и решать: пускать или нет. Вот этот интерфейс — он и есть такой цифровой охранник, блядь. Даёт ему на вход один объект (это T t), а он его так оценивает и бух: true — проходи, false — иди нахуй, в очередь за пивом.
Вот его главный и единственный навык, метод test:
boolean test(T t)
Всё, больше от него нихуя не надо. Просто спросить: "Ну что, проходим?"
Смотри, как это выглядит вживую:
import java.util.function.Predicate;
// Создаём нашего охранника. Этот проверяет, пустая ли строка.
Predicate<String> isEmpty = String::isEmpty;
// А этот — длинная ли строка, больше 10 символов.
Predicate<String> isLong = s -> s.length() > 10;
// Подходим к первому: "Эй, пустая строка, ты кто?"
System.out.println(isEmpty.test("")); // true — ага, пустая, проходи.
// Ко второму: "Строка 'Hello World', ты длинная?"
System.out.println(isLong.test("Hello World")); // true — 11 символов, да, длинная, тоже проходи.
А вот тут самое интересное начинается, блядь! Этих охранников можно между собой скрещивать, как каких-то блядских терминаторов! У них есть default-методы — просто ёперный театр!
Комбинируем логику, как боги:
// Хотим охранника, который пропускает только длинные И НЕ пустые строки.
Predicate<String> isLongAndNotEmpty = isLong.and(isEmpty.negate());
// .and() — это "И". .negate() — это "НЕ", то есть инвертирует условие.
System.out.println(isLongAndNotEmpty.test("Hello")); // false — не длинный, нахуй.
System.out.println(isLongAndNotEmpty.test("Hello World!")); // true — и длинный, и не пустой, красава, заходи.
// Ещё есть .or() — "ИЛИ", и .xor() — "исключающее ИЛИ", если ты, конечно, шаришь.
А где это всё, блядь, применяется? Да везде, сука! Особенно в этих ваших Stream API, где всё фильтруют, как золотоискатели.
Практика, мать её:
import java.util.List;
import java.util.Arrays;
List<String> names = Arrays.asList("Anna", "Bob", "Alexander", "Kate");
// Охранник №1: имя должно начинаться на 'A'
Predicate<String> startsWithA = s -> s.startsWith("A");
// Охранник №2: имя должно быть коротким (<=3 символа)
Predicate<String> isShort = s -> s.length() <= 3;
// Запускаем поток имён через фильтр. Условие: начинается на 'A' ИЛИ короткое.
names.stream()
.filter(startsWithA.or(isShort)) // Вот она, магия комбинации!
.forEach(System.out::println); // Вывод: Anna (на 'A'), Bob (короткое), Alexander (на 'A')
// Kate — не прошла, потому что хитрая жопа: и не на 'A', и не короткая.
Ну и зачем весь этот цирк, спросишь? А затем, чувак, что это пиздец как удобно! Вместо того чтобы размазывать условия по всему коду, ты упаковываешь логику в аккуратный объект-предикат. Его можно передать в метод, вернуть из метода, собрать из кусочков, как конструктор. Особенно когда работаешь с коллекциями — один раз описал правило фильтрации и юзаешь его где угодно. Красота, блядь, а не интерфейс! В рот меня чих-пых от такой элегантности.