Встроенный Predicate в Java 8, всегда возвращающий true

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Самый простой способ реализации достигается с помощью лямбда-выражения:

Java
Скопировать код
Predicate<Object> alwaysTrue = x -> true;

Здесь лямбда-выражение определяет предикат, который гарантированно возвращает true, не зависимо от передаваемого аргумента.

Кинга Идем в IT: пошаговый план для смены профессии

Приступаем к работе с предикатами

Лямбда в роли нашего главного инструмента

В Java 8 не предусмотрены встроенные функции предиката, который бы всегда возвращал истину или ложь. Однако легко создать такую функциональность через лямбда-выражения. По сравнению с анонимными классами, лямбды выглядят более краткими и понятными.

Java
Скопировать код
// Предикат, который никогда не подведет!
Predicate<Object> myConstantCompanion = x -> true;

Применим концепцию повторного использования

Помните x -> true? Это лямбда выражение не только крайне просто, но и может быть оптимизировано при выполнении благодаря встроенным возможностям Java Virtual Machine. Это приводит к снижению нагрузки на систему. Использование повторное позволит снизить вероятность ошибок и дублирования кода.

Java
Скопировать код
// Экономим ресурсы — используем повторно
Predicate<Object> ecoFriendlyPredicate = myConstantCompanion;

Альтернативы, предложенные сообществом

Не смотря на то, что стандартный пакет Java не предлагает специализированных предикатов, которые всегда возвращают истину или ложь, сторонние библиотеки, такие как Guava и Spring, предоставляют такую функциональность. Пример из Spring Data Util:

Java
Скопировать код
// Способ работы Spring
import org.springframework.data.util.Predicates;

Predicate<Object> alwaysTrue = Predicates.isTrue();
Predicate<Object> alwaysFalse = Predicates.isFalse();

И развеиваем миф о Java SE...

Существует распространенное мнение, что Java SE отвергла предложение ввести именованные статические методы для предикатов, всегда возвращающих истину. Но на самом деле такого предложения официально не поступало.

Визуализация

В Java 8 наш предикат столь же доброжелателен, как бабушка с печеньками:

Java
Скопировать код
Predicate<String> grandmaWithCookies = s -> true;

С каждым запросом на печенье:

Markdown
Скопировать код
👦: "Бабушка, могу я взять печенье?"
👵: "Конечно, дорогой!"

👦: "А если спрошу 100 раз?"
👵: "Всегда да, миленький!"

Предикат grandmaWithCookies никогда не откажет в просьбе.

Поглубже познакомимся с лямбда-выражениями

Простота чтения и написания

Лямбда s -> true легко воспринимается и упрощает поддержку кода в сравнении с анонимными классами.

Java
Скопировать код
// "s -> true" — предикат, как шведский стол.
Predicate<Object> allYouCanEat = s -> true;

Многофункциональность предикатов

Предикаты можно объединять между собой через .and() и .or(). Но стоит быть осторожным и не злоупотреблять их использованием, чтобы код оставался эффективным и надежным.

Java
Скопировать код
// Комбинируем предикаты осторожно, чтобы избежать перегрузки
Predicate<Object> overloadExample = allYouCanEat.and(allYouCanEat).or(allYouCanEat);

Совершенствуем мастерство в лямбдах

Чтобы расширить свое понимание, рекомендуется изучить "Lambda FAQ" Анжелики Лангер – она содержит обширную информацию о лямбда-выражениях в Java.

Полезные материалы

  1. Predicate (Java Platform SE 8) — Ваш путеводитель по предикатам в Java SE 8.
  2. Lambda Expressions (The Java™ Tutorials) — Официальное руководство Oracle по лямбда-выражениям.
  3. Java Functional Interfaces — Справочник функциональных интерфейсов в Java.
  4. java.util.function (Java Platform SE 8) — Обзор функциональных интерфейсов в Java SE 8 от Oracle.