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