Future[Boolean] 中的布尔逻辑
Boolean logic in Future[Boolean]
在非并发编程中,我们通常会有这样的布尔逻辑:
boolean canIMarryher(){
return iLoveHer() && myParentsLoveHer() && shesHot() && sheSaidYes();
}
我的问题来了,如果所有这些(或其中一些条件)在 scala 中都是 Future[Boolean] 怎么办?我还能像上面的例子那样得到一个清晰的方法吗?
更新
如您所知,在 运行 时间的布尔逻辑中,我们将有 'optimization',例如:当使用 &&
并遇到 false
或使用 [= 时立即 return 13=] 遇到了 true
。我也可以在 Future[Boolean] 中使用它吗?
此致,
德鲁
正如数学所说,Future.reduce
如果您可以将它们视为一系列值,则很好,如果您需要对每个值赋予更多含义,则可以使用 for comprehension:
val isThereAFuture: Future[Boolean] =
for {
iLoveHer <- doILoveHer()
myParentsLoveHer <- doMyParentsLoveHer()
sheLovesMe <- doesSheLoveMe()
} yield iLoveHer && myParentsLoveHer && sheLovesMe
其他带有 for-comprehension 和 reduce 的答案不会 "short-circuit." 也就是说,如果第一个 future 需要一段时间才能完成,即使第二个 future 评估 false
立即。
澄清一下,这与传统布尔逻辑中的短路不同,在传统布尔逻辑中我们按名称计算运算符的右侧。相反,目标是尽快产生答案。我们立即开始每个未来的计算,并在结果进来时尽可能短路。在最好的情况下,我们只需要等待最快的未来,在最坏的情况下,我们必须等待最慢的未来。
支持这种短路的方法如下:
def all(futures: Future[Boolean]*)(implicit executor: ExecutionContext): Future[Boolean] = {
Future.find(futures) { !_ } map { _.isEmpty }
}
def canIMarryher = all(iLoveHer, myParentsLoveHer, shesHot, sheSaidYes)
如果你真的想,你可以进一步定义 && 和 || Future[Boolean]
的方法
在非并发编程中,我们通常会有这样的布尔逻辑:
boolean canIMarryher(){
return iLoveHer() && myParentsLoveHer() && shesHot() && sheSaidYes();
}
我的问题来了,如果所有这些(或其中一些条件)在 scala 中都是 Future[Boolean] 怎么办?我还能像上面的例子那样得到一个清晰的方法吗?
更新
如您所知,在 运行 时间的布尔逻辑中,我们将有 'optimization',例如:当使用 &&
并遇到 false
或使用 [= 时立即 return 13=] 遇到了 true
。我也可以在 Future[Boolean] 中使用它吗?
此致, 德鲁
正如数学所说,Future.reduce
如果您可以将它们视为一系列值,则很好,如果您需要对每个值赋予更多含义,则可以使用 for comprehension:
val isThereAFuture: Future[Boolean] =
for {
iLoveHer <- doILoveHer()
myParentsLoveHer <- doMyParentsLoveHer()
sheLovesMe <- doesSheLoveMe()
} yield iLoveHer && myParentsLoveHer && sheLovesMe
其他带有 for-comprehension 和 reduce 的答案不会 "short-circuit." 也就是说,如果第一个 future 需要一段时间才能完成,即使第二个 future 评估 false
立即。
澄清一下,这与传统布尔逻辑中的短路不同,在传统布尔逻辑中我们按名称计算运算符的右侧。相反,目标是尽快产生答案。我们立即开始每个未来的计算,并在结果进来时尽可能短路。在最好的情况下,我们只需要等待最快的未来,在最坏的情况下,我们必须等待最慢的未来。
支持这种短路的方法如下:
def all(futures: Future[Boolean]*)(implicit executor: ExecutionContext): Future[Boolean] = {
Future.find(futures) { !_ } map { _.isEmpty }
}
def canIMarryher = all(iLoveHer, myParentsLoveHer, shesHot, sheSaidYes)
如果你真的想,你可以进一步定义 && 和 || Future[Boolean]