内置的 Java8谓词总是返回 true?

谷歌番石榴有一个断言,总是返回 true。Java8的 Predicate也有类似的东西吗?我知道我可以使用 (foo)->{return true;},但我想要一些预制的,类似于 Collections.emptySet()

72596 次浏览

Java8中没有内置的始终为 true 和始终为 false 的谓词

x -> true

还有

x -> false

比较一下

Predicates.alwaysTrue() // Guava

最后是一个匿名的内部类:

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

Guava 具有这些内置谓词的原因可能是静态方法调用相对于匿名内部类有巨大的语法优势。在 Java8中,lambda 语法非常简洁,以至于有一个用于编写静态方法调用的语法 不利条件

不过那只是句法比较。如果只有一个全局始终为真的谓词,那么与分布在多个类中的 x -> true出现相比,空间优势可能很小,因为每个类都会创建自己的谓词实例。这就是你担心的吗?节省下来的钱看起来并不令人信服,这可能就是为什么一开始没有把它们加进去的原因。但是在未来的版本中可以重新考虑。

更新日期2015-04-24

我们已经考虑过添加各种静态的命名函数,比如 Predicate.alwaysTrueRunnable.noop等等,并且我们已经决定在未来的 JavaSE 版本中不再添加更多的函数。

当然,对于具有名称的函数和写出的 lambda 函数,有一些值,但是这个值非常小。我们希望人们将学习如何读写 x -> true() -> { },并且他们的用法将成为习惯用法。甚至 Function.identity()的价值超过 x -> x也是值得怀疑的。

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

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

请参阅 Lambda 常见问题解答条目。

没有番石榴

Boolean.TRUE::booleanValue

如果您正在 Spring 框架中寻找这个:

org.springframework.data.util.Predicates 支持这一点。

Predicates.isTrue()Predicates.isFalse()