始终返回 true 的内置 Java 8 谓词?

新手上路,请多包涵

Google Guava 有一个 始终返回 true 的谓词。 Java 8 的 Predicate 有类似的东西吗?我知道我可以使用 (foo)->{return true;} ,但我想要一些预制的东西,类似于 Collections.emptySet()

原文由 Garret Wilson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 533
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 中,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 常见问题 条目。

原文由 Stuart Marks 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题