在非并发编程中,我们通常有这种布尔逻辑:
boolean canIMarryher(){
return iLoveHer() && myParentsLoveHer() && shesHot() && sheSaidYes();
}
我的问题出现了,如果所有这些(或其中一些条件)都是scala中的Future [Boolean]怎么办?我可以像上面的例子那样得到一个明确的方法吗?
更新
如您所知,在运行时的布尔逻辑中,我们已经进行了优化'喜欢:在使用&&
并遇到false
或使用||
并遇到true
时立即返回。我可以在Future [Boolean]中使用它吗?
此致 德鲁
答案 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