Встроенный Predicate в Java 8, всегда возвращающий true
Быстрый ответ
Самый простой способ реализации достигается с помощью лямбда-выражения:
Predicate<Object> alwaysTrue = x -> true;
Здесь лямбда-выражение определяет предикат, который гарантированно возвращает true
, не зависимо от передаваемого аргумента.
Приступаем к работе с предикатами
Лямбда в роли нашего главного инструмента
В Java 8 не предусмотрены встроенные функции предиката, который бы всегда возвращал истину или ложь. Однако легко создать такую функциональность через лямбда-выражения. По сравнению с анонимными классами, лямбды выглядят более краткими и понятными.
// Предикат, который никогда не подведет!
Predicate<Object> myConstantCompanion = x -> true;
Применим концепцию повторного использования
Помните x -> true
? Это лямбда выражение не только крайне просто, но и может быть оптимизировано при выполнении благодаря встроенным возможностям Java Virtual Machine. Это приводит к снижению нагрузки на систему. Использование повторное позволит снизить вероятность ошибок и дублирования кода.
// Экономим ресурсы — используем повторно
Predicate<Object> ecoFriendlyPredicate = myConstantCompanion;
Альтернативы, предложенные сообществом
Не смотря на то, что стандартный пакет Java не предлагает специализированных предикатов, которые всегда возвращают истину или ложь, сторонние библиотеки, такие как Guava и Spring, предоставляют такую функциональность. Пример из Spring Data Util:
// Способ работы Spring
import org.springframework.data.util.Predicates;
Predicate<Object> alwaysTrue = Predicates.isTrue();
Predicate<Object> alwaysFalse = Predicates.isFalse();
И развеиваем миф о Java SE...
Существует распространенное мнение, что Java SE отвергла предложение ввести именованные статические методы для предикатов, всегда возвращающих истину. Но на самом деле такого предложения официально не поступало.
Визуализация
В Java 8 наш предикат столь же доброжелателен, как бабушка с печеньками:
Predicate<String> grandmaWithCookies = s -> true;
С каждым запросом на печенье:
👦: "Бабушка, могу я взять печенье?"
👵: "Конечно, дорогой!"
👦: "А если спрошу 100 раз?"
👵: "Всегда да, миленький!"
Предикат grandmaWithCookies
никогда не откажет в просьбе.
Поглубже познакомимся с лямбда-выражениями
Простота чтения и написания
Лямбда s -> true
легко воспринимается и упрощает поддержку кода в сравнении с анонимными классами.
// "s -> true" — предикат, как шведский стол.
Predicate<Object> allYouCanEat = s -> true;
Многофункциональность предикатов
Предикаты можно объединять между собой через .and()
и .or()
. Но стоит быть осторожным и не злоупотреблять их использованием, чтобы код оставался эффективным и надежным.
// Комбинируем предикаты осторожно, чтобы избежать перегрузки
Predicate<Object> overloadExample = allYouCanEat.and(allYouCanEat).or(allYouCanEat);
Совершенствуем мастерство в лямбдах
Чтобы расширить свое понимание, рекомендуется изучить "Lambda FAQ" Анжелики Лангер – она содержит обширную информацию о лямбда-выражениях в Java.
Полезные материалы
- Predicate (Java Platform SE 8) — Ваш путеводитель по предикатам в Java SE 8.
- Lambda Expressions (The Java™ Tutorials) — Официальное руководство Oracle по лямбда-выражениям.
- Java Functional Interfaces — Справочник функциональных интерфейсов в Java.
- java.util.function (Java Platform SE 8) — Обзор функциональных интерфейсов в Java SE 8 от Oracle.