【发布时间】:2020-01-12 14:43:29
【问题描述】:
我有一堆谓词,我想用逻辑“and”将它们链接在一起,这样最终结果只有在所有单独的谓词都评估为真时才为真。
在我看来,有两种方法可以写这个。我可以像这样将它们链接在一起:
Predicate composedPredicate =
predicate1
.and(predicate2)
.and(predicate3)
.and(predicate4)
或者我可以使用这样的更嵌套的方法:
Predicate composedPredicate =
predicate1
.and(predicate2
.and(predicate3
.and(predicate4)))
显然,选项 1 更具可读性,但似乎它的效率可能略低。我想选项1大致相当于:
(((p1 && p2) && p3) && p4)
虽然选项 2 是:
(p1 && (p2 && (p3 && p4)))
在第二种情况下,将评估第一个参数p1,如果它是假的,整个事情会立即短路,你就完成了。在第一个选项中,第一个参数实际上是整个表达式((p1 && p2) && p3),它本身具有(p1 && p2) 的第一个参数,而p1 作为其第一个参数。基本上,在实际可以评估 p1 之前,您将在堆栈上再走 2 个“步骤”。我实际上不知道 Java 是如何实现默认谓词方法的,如果我在这里错了,请纠正我。
有什么方法可以两全其美?如果不是,我应该更倾向于使用更具可读性的方法,而不是可能带来非常微弱的性能提升,反之亦然?
【问题讨论】:
标签: java functional-programming predicate functional-interface