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

Google Guava имеет предикат, который всегда возвращает true. Есть ли у Java 8 нечто похожее на его Predicate? Я знаю, что могу использовать (foo)->{return true;}, но мне нужно что-то готовое, аналогичное Collections.emptySet().

Ответ 1

В Java 8 нет встроенных всегда-истинных и всегда ложных предикатов. Самый сжатый способ их записи -

x -> true

и

x -> false

Сравните их с

Predicates.alwaysTrue() // Guava

и, наконец, анонимный внутренний класс:

new Predicate<Object>() {
    public boolean test(Object x) {
        return true;
    }
}

Вероятно, причина, по которой у Guava есть эти встроенные предикаты, заключается в том, что существует огромное синтаксическое преимущество вызова статического метода над анонимным внутренним классом. В Java 8 синтаксис лямбда настолько краток, что существует синтаксический недостаток для написания вызова статического метода.

Это просто синтаксическое сравнение. Вероятно, небольшое преимущество пространства, если существует один глобальный всегда истинный предикат, по сравнению с x -> true событиями, распространяющимися по нескольким классам, каждый из которых создавал бы свой собственный экземпляр предиката. Это то, что вас беспокоит? Экономия не выглядела убедительной, поэтому, вероятно, они не были добавлены в первую очередь. Но он может быть пересмотрен для будущего выпуска.

ОБНОВЛЕНИЕ 2015-04-24

Мы рассмотрели добавление множества статических именованных функций, таких как Predicate.alwaysTrue, Runnable.noop и т.д., и мы решили не добавлять больше в будущие версии Java SE.

Конечно, есть некоторая ценность в чем-то, у которого есть имя против выписанной лямбда, но это значение довольно мало. Мы ожидаем, что люди научатся читать и писать x -> true и () -> { } и что их использование станет идиоматичным. Даже значение Function.identity() над x -> x является сомнительным.

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

Хольгер также упомянул в комментариях возможность оптимизации составных функций, таких как Predicate.or и т.д. Это было также рассмотрено (JDK-8067971), но считалось несколько хрупким и подверженным ошибкам, и происходило нечасто настолько, что это не стоило усилий для реализации.

Смотрите также этот элемент Lambda FAQ.

Ответ 2

Без guava

Boolean.TRUE:: booleanValue