Scala:有条件地根据一个未来执行另一个未来的最惯用方法?
执行以下操作的最惯用、最简洁的方式是什么:一个未来可能执行,也可能不执行,取决于以前的未来执行,或者取决于以前的未来执行的结果,如:Scala:有条件地根据一个未来执行另一个未来的最惯用方法?,scala,future,Scala,Future,执行以下操作的最惯用、最简洁的方式是什么:一个未来可能执行,也可能不执行,取决于以前的未来执行,或者取决于以前的未来执行的结果,如: def getItFromHere : Future[Option[Something]] = ... def getItFromThere : Future[Option[Something]] = ... def getIt : Future[Option[Something]] = { for { maybeSomething
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
}
def getItFromHere:Future[Option[Something]]=。。。
def getItFromThere:Future[Option[Something]]=。。。
def getIt:Future[选项[某物]]={
为了{
如果在缓存中找不到任何项,那么将来可能会失败,然后通过检索将其恢复
// assuming getItFromHere() fails if no item is found
getItFromHere() recoverWith { case _ => getItFromThere() }
或者使用选项
可以这样做:
getItFromHere() flatMap {
case Some(x) => Future.successful(Some(x))
case None => getItFromThere()
}
事实上,你的例子就在这里。你只需要匹配一元合成所期望的未来类型:
for {
fut <- someFuture
something <- fut.map(x=>someFuture).getOrElse(someBetterFuture)
} yield something
如果您使用scalaz的OptionT transformer:
def getItFromHere : OptionT[Future,Something] = OptionT(...)
def getItFromThere : OptionT[Future,Something] = OptionT(...)
def getIt : Future[Option[Something]] = (getItFromHere orElse getItFromThere).run
谢谢@drexin。maasg的答案是我想的,但你的答案是正确的,我投了更高的票。一个错误:你应该返回未来。成功(一些(x))
def getItFromHere : OptionT[Future,Something] = OptionT(...)
def getItFromThere : OptionT[Future,Something] = OptionT(...)
def getIt : Future[Option[Something]] = (getItFromHere orElse getItFromThere).run