Java 8中没有内置的永远为真和永远为假的谓词。最简单的编写方式是
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.alwaysTrue,
Runnable.noop等,我们已决定不添加任何更多的在Java
SE的未来版本。
当然,具有名称与已写出的lambda的值中有些值,但是这个值很小。我们希望人们将学习如何阅读和书写
x -> true,
() -> {}并且他们的用法将成为习惯用法。甚至Function.identity()超过的价值
x -> x也值得怀疑。
重用现有功能而不是评估已写出的lambda在性能上有很小的优势,但是我们期望这些功能的使用量很小,以至于这种优势可以忽略不计,当然不值得API夸大。
Holger在评论中还提到了优化诸如此类的组合函数的可能性
Predicate.or。这也被认为是(JDK-8067971),但被认为有些脆弱并且容易出错,并且发生的频率不高,因此不值得进行努力。
另请参阅此Lambda FAQ条目。



