首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala异步计算练习

Scala异步计算练习
EN

Stack Overflow用户
提问于 2013-08-27 11:42:44
回答 2查看 155关注 0票数 0

我在下面概述了这个问题。方法calculate表示异步运行subCalc1subCalc2的计算,将传递的mainCalc表示最后两个“子”计算的结果。重要的是,在开始这些计算之前,一个初步的计算isCalcNecessary是返回一个布尔值。如果为真,计算将继续进行,并最终返回Future[SomeResult]。如果初步计算返回假,则应返回FutureNone,以说明计算是不必要的。这个小算法应该是最大异步的。

代码语言:javascript
复制
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 )失败。

你怎么写这个算法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-27 12:09:06

代码语言:javascript
复制
isCalcNecessary(param).flatMap { necessary => 
  if (necessary) 
    for {
      subResult1 <- subCalc1(param)
      subResult2 <- subCalc2(param)
      result <- mainCalc(subResult1, subResult2)
    } yield Some(result)
  else
    future(None)
}
票数 2
EN

Stack Overflow用户

发布于 2013-08-27 18:37:35

另一个选择是为理解而筑巢。

代码语言:javascript
复制
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 endResult
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18464424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档