Future [Boolean]中的布尔逻辑

时间:2015-09-05 15:33:33

标签: scala future boolean-logic

在非并发编程中,我们通常有这种布尔逻辑:

boolean canIMarryher(){
    return iLoveHer() && myParentsLoveHer() && shesHot() && sheSaidYes();
}

我的问题出现了,如果所有这些(或其中一些条件)都是scala中的Future [Boolean]怎么办?我可以像上面的例子那样得到一个明确的方法吗?

更新 如您所知,在运行时的布尔逻辑中,我们已经进行了优化'喜欢:在使用&&并遇到false或使用||并遇到true时立即返回。我可以在Future [Boolean]中使用它吗?

此致 德鲁

2 个答案:

答案 0 :(得分:8)

其他的理解和减少的答案不会“短路”。也就是说,如果第一个未来需要一段时间才能完成,我们将等待整个时间,即使第二个未来会立即评估false

为了澄清,这与传统布尔逻辑中的短路不同,在传统布尔逻辑中,我们通过名称来评估运算符的右侧。相反,目标是尽快产生答案。我们立即开始每一个未来的计算,并在结果出现时尽可能短路。在最好的情况下,我们只需等待最快的未来,在最坏的情况下,我们必须等待最慢的未来。 / p>

这是一种支持这种短路的方法:

def all(futures: Future[Boolean]*)(implicit executor: ExecutionContext): Future[Boolean] = {
  Future.find(futures) { !_ } map { _.isEmpty }
}

def canIMarryher = all(iLoveHer, myParentsLoveHer, shesHot, sheSaidYes)

如果你真的想,你可以进一步理解并定义&&和|| Future[Boolean]

的方法

答案 1 :(得分:4)

正如数学所说,Future.reduce是好的,如果你可以把它们视为一系列价值观,如果你需要为它们中的每一个增加更多的意义,你可以用它来理解:

val isThereAFuture: Future[Boolean] = 
  for {
    iLoveHer <- doILoveHer()
    myParentsLoveHer <- doMyParentsLoveHer()
    sheLovesMe <- doesSheLoveMe()
  } yield iLoveHer && myParentsLoveHer && sheLovesMe
相关问题