Scala:最有条理的方式来有条件地执行一个Future取决于另一个?

Lio*_*ior 3 scala future

执行以下操作的最惯用和最简洁的方法是:根据以前的执行情况执行或未执行的未来,如下所示:

def getItFromHere : Future[Option[Something]] = ...

def getItFromThere : Future[Option[Something]] = ...

def getIt : Future[Option[Something]] = {

    for {
        maybeSomething <- getItFromHere
        probablySomething <- maybeSomething.getOrElse(getItFromThere) // Obviously can't be done!!!
    }
    yield probablySomething
}
Run Code Online (Sandbox Code Playgroud)

一个特定的用例示例:从缓存中获取一个项目,只有在缓存中找不到它,才能从数据库中获取它.

我在这里假设getItFromHere并且getItFromThere不会因异常而失败.他们将返回Some [Something]或None.随意考虑这个假设,或者在没有它的情况下给予更好的假设.

注意:我理解for-comprehension的内部机制,它实际上是内部转换为map/flatMap/filter.

dre*_*xin 6

如果在缓存中找不到任何项目,然后通过检索恢复,则可能会失败.

// assuming getItFromHere() fails if no item is found
getItFromHere() recoverWith { case _ => getItFromThere() }
Run Code Online (Sandbox Code Playgroud)

或者Option你可以这样做:

getItFromHere() flatMap {
  case Some(x) => Future.successful(Some(x))
  case None => getItFromThere()
}
Run Code Online (Sandbox Code Playgroud)