Stu*_*rks 151
Java 8中没有内置的always-true和always-false谓词.编写这些内容的最简洁方法是
x -> true
Run Code Online (Sandbox Code Playgroud)
和
x -> false
Run Code Online (Sandbox Code Playgroud)
比较这些
Predicates.alwaysTrue() // Guava
Run Code Online (Sandbox Code Playgroud)
最后到一个匿名的内部类:
new Predicate<Object>() {
public boolean test(Object x) {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
可能是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条目.
小智 6
没有番石榴
Boolean.TRUE::booleanValue
Run Code Online (Sandbox Code Playgroud)
如果您正在 Spring 框架中寻找此内容:
org.springframework.data.util.Predicates支持这一点。
Predicates.isTrue(),Predicates.isFalse()
| 归档时间: |
|
| 查看次数: |
39288 次 |
| 最近记录: |