内置的Java 8谓词总是返回true?

时间:2014-10-24 14:11:50

标签: java lambda java-8 predicate

Google Guava的谓词为always returns true。 Java 8的Predicate是否有类似的东西?我知道我可以使用(foo)->{return true;},但我需要预先制作的内容,类似于Collections.emptySet()

2 个答案:

答案 0 :(得分:140)

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中,lambda语法非常简洁,以及写出静态方法调用的语法缺点

但这只是一种语法比较。与分布在多个类中的x -> true个出现相比,如果存在单个全局始终为真的谓词,则可能存在小的空间优势,每个类都会创建自己的谓词实例。这是你关心的吗?这些节省似乎并不引人注目,这可能就是为什么它们首先没有被添加的原因。但是可以重新考虑将来的版本。

更新2015-04-24

我们考虑过添加各种静态命名函数,例如Predicate.alwaysTrueRunnable.noop等,我们决定不再在Java的未来版本中添加SE。

当然,有一些名称与写出的lambda有一些价值,但这个值非常小。我们希望人们会学习如何阅读和撰写x -> true() -> { },并且他们的用法将成为惯用语。即使Function.identity()超过x -> x的价值也值得怀疑。

重用现有函数而不是评估写出的lambda有一个微小的性能优势,但是我们希望这些函数的使用非常小,以至于这样的优势可以忽略不计,当然不值得API膨胀。

Holger在评论中还提到了优化组合函数的可能性,例如Predicate.or等。这也被认为是(JDK-8067971),但被认为有点脆弱且容易出错,并且很少发生,因此不值得付出努力。

另请参阅此Lambda FAQ条目。

答案 1 :(得分:3)

没有番石榴

Boolean.TRUE::booleanValue