Future [Boolean]中的布尔逻辑

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]中使用它吗?

问候,德鲁

dwi*_*ern 9

理解和减少的其他答案不会"短路".也就是说,如果第一个未来需要一段时间才能完成,我们将等待整个时间,即使第二个未来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]

  • 仅供参考:https://github.com/johanandren/futiles/blob/master/src/main/scala/markatta/futiles/Boolean.scala#L8 (3认同)

joh*_*ren 5

正如数学所说,Future.reduce如果您可以将它们视为一系列值,那就太好了,如果您需要为每个值赋予更多含义,则可以使用 a 来理解:

val isThereAFuture: Future[Boolean] = 
  for {
    iLoveHer <- doILoveHer()
    myParentsLoveHer <- doMyParentsLoveHer()
    sheLovesMe <- doesSheLoveMe()
  } yield iLoveHer && myParentsLoveHer && sheLovesMe
Run Code Online (Sandbox Code Playgroud)