Google Guava 有一个 始终返回 true
的谓词。 Java 8 的 Predicate
有类似的东西吗?我知道我可以使用 (foo)->{return true;}
,但我想要一些预制的东西,类似于 Collections.emptySet()
。
原文由 Garret Wilson 发布,翻译遵循 CC BY-SA 4.0 许可协议
Google Guava 有一个 始终返回 true
的谓词。 Java 8 的 Predicate
有类似的东西吗?我知道我可以使用 (foo)->{return true;}
,但我想要一些预制的东西,类似于 Collections.emptySet()
。
原文由 Garret Wilson 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您在 Spring 框架中寻找这个:
org.springframework.data.util.Predicates
支持这个。
Predicates.isTrue()
, Predicates.isFalse()
原文由 krishnakumarp 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
Java 8 中没有内置的 always-true 和 always-false 谓词。最简洁的写法是
和
比较这些
最后是匿名内部类:
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 常见问题 条目。