我在下面概述了这个问题。方法calculate表示异步运行subCalc1和subCalc2的计算,将传递的mainCalc表示最后两个“子”计算的结果。重要的是,在开始这些计算之前,一个初步的计算isCalcNecessary是返回一个布尔值。如果为真,计算将继续进行,并最终返回Future[SomeResult]。如果初步计算返回假,则应返回FutureNone,以说明计算是不必要的。这个小算法应该是最大异步的。
def isCalcNecessary:Future[Boolean] = ...
def subCalc1(param:Param):Future[SubResult1] = ...
def subCalc2(param:Param):Future[SubResult2] = ...
def mainCalc(subResult1:SubResult1, subResult2:SubResult2):Future[Result] = .
def calcute(param:Param):Future[Option[Result]] = for {
necessary <- isCalcNecessary(param)
if necessary // this illustration fails at runtime if 'necessary' is false
subResult1 <- subCalc1(param)
subResult2 <- subCalc2(param)
result <- mainCalc(subResult1, subResult2)
} yield Some(result)如果不满足NoSuchElementException: Future.filter predicate is not satisfied (Future.scala:312)条件,上述说明将在运行时( if necessary )失败。
你怎么写这个算法?
发布于 2013-08-27 12:09:06
isCalcNecessary(param).flatMap { necessary =>
if (necessary)
for {
subResult1 <- subCalc1(param)
subResult2 <- subCalc2(param)
result <- mainCalc(subResult1, subResult2)
} yield Some(result)
else
future(None)
}发布于 2013-08-27 18:37:35
另一个选择是为理解而筑巢。
def calculate(param:Param):Future[Option[Result]] = for {
necessary <- isCalcNecessary(param)
endResult <- if (necessary) for {
subResult1 <- subCalc1(param)
subResult2 <- subCalc2(param)
result <- mainCalc(subResult1, subResult2)
} yield Some(result)
else future(None)
} yield endResulthttps://stackoverflow.com/questions/18464424
复制相似问题