内置的Java 8谓词总是返回true?
谷歌Guava有一个谓词总是返回true
。 Java 8是否有类似于Predicate
东西? 我知道我可以使用(foo)->{return true;}
,但是我想要一些预制的东西,类似于Collections.emptySet()
。
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
事件相比,每个类都会创build自己的谓词实例。 这是你关心的吗? 节省似乎并不令人信服,这可能是为什么他们不是首先join。 但可以重新考虑未来的版本。
UPDATE 2015-04-24
我们考虑过添加各种静态的命名函数,如Predicate.alwaysTrue
, Runnable.noop
等等,我们决定在未来的Java SE版本中不再添加。
当然,有一个名称与写出的lambda有一定的关系,但是这个值很小。 我们期望人们将学习如何读写x -> true
和() -> { }
,并且他们的用法将会变得习惯。 即使Function.identity()
在x -> x
也值得怀疑。
重用一个现有的函数,而不是评估一个已经写好的lambda有一个很小的性能优势,但是我们期望这些types的函数的使用非常小,这样的好处可以忽略不计,肯定不值得API膨胀。
Holger在评论中也提到了优化诸如Predicate.or
等组合函数的可能性。 这也被认为是( JDK-8067971 ),但被认为有些脆弱和容易出错,而且不经常发生,不值得付诸实施。
另请参阅此Lambda FAQ条目。
没有番石榴
Boolean.TRUE ::的booleanValue