执行以下操作的最惯用和最简洁的方法是:根据以前的执行情况执行或未执行的未来,如下所示:
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.
如果在缓存中找不到任何项目,然后通过检索恢复,则可能会失败.
// 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)