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]

的方法