内置的 Java 8 谓词总是返回 true?

2022-08-31 07:23:23

Google 番石榴有一个总是返回 true谓词。Java 8是否有类似的东西?我知道我可以使用,但我想要一些预先制作的东西,类似于.Predicate(foo)->{return true;}Collections.emptySet()


答案 1

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 语法非常简洁,以至于写出静态方法调用存在语法上的缺点

不过,这只是一个语法上的比较。如果存在单个全局始终为 true 谓词,则与分布在多个类中的事件相比,可能存在很小的空间优势,每个类都会创建自己的谓词实例。这是你所关心的吗?节省的成本似乎并不引人注目,这可能就是为什么它们一开始就没有被添加的原因。但可以在未来的版本中重新考虑它。x -> true

更新 2015-04-24

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

当然,在具有名称与写出的lambda的事物中存在一些值,但是该值非常小。我们希望人们将学习如何阅读和写作,并且他们的用法将成为惯用语。甚至over的价值也是值得怀疑的。x -> true() -> { }Function.identity()x -> x

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

Holger还在评论中提到了优化组合函数等的可能性。这也被考虑过(JDK-8067971),但被认为有些脆弱和容易出错,并且发生的频率不够高,不值得努力实现。Predicate.or

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


答案 2

如果你在春季框架中寻找这个:

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

Predicates.isTrue(),Predicates.isFalse()


推荐