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

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

101 голос | спросил Garret Wilson 24 +04002014-10-24T18:11:49+04:00312014bEurope/MoscowFri, 24 Oct 2014 18:11:49 +0400 2014, 18:11:49

2 ответа


0

В 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 ), но считалось несколько хрупким и ошибочным. склонны к тому, чтобы происходить достаточно редко, чтобы это не стоило усилий для реализации.

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

ответил Stuart Marks 24 +04002014-10-24T21:51:50+04:00312014bEurope/MoscowFri, 24 Oct 2014 21:51:50 +0400 2014, 21:51:50
0

Без гуавы

Boolean.TRUE::booleanValue
ответил boriselec 20 +03002017-10-20T13:42:04+03:00312017bEurope/MoscowFri, 20 Oct 2017 13:42:04 +0300 2017, 13:42:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132