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



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

690   2  

2 ответов:

в Java 8 нет встроенных предикатов always-true и always-false. Самый краткий способ написать это

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() over x -> x сомнительна.

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

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

см. также лямда-часто задаваемые вопросы запись.

без гуавы

Boolean.TRUE::booleanValue

Comments

    Ничего не найдено.