如何转型Future[Option[Future[Option[X]]]]
into Future[Option[X]]
?
如果它是一个TraversableOnce
代替Option
我会用未来的伴生对象 http://www.scala-lang.org/api/current/index.html#scala.concurrent.Future%24;但是选项呢?
Example:
def processAndReturnFuture(x:String):Future[String] = future(x)
def processAgainAndReturnOption(x:String):Option[String] = Some(x)
val futOpt:Future[Option[String]] = future(Some("x"))
val futOptFutOpt:Future[Option[Future[Option[String]]]] =
futOpt.map( opt =>
opt.map( x =>
processAndReturnFuture(x).map( processedX =>
processAgainAndReturnOption(processedX)
)
)
)
更新答案
这可能会起作用。我所做的是替换你的前两个map
呼叫与flatMap
在最外面Future
和最外面的模式匹配Option
.
val futOptFutOpt: Future[Option[String]] =
futOpt.flatMap {
case None => Future.successful(None)
case Some(x) =>
processAndReturnFuture(x).map {
processedX => processAgainAndReturnOption(processedX)
}
}
初步答复
我假设你的代码中的某个地方有一个map
调用转换一个Future[Option[A]]
into a Future[Option[Future[Option[X]]]]
。替换那个map
with a flatMap
并放下最上面的Option
结果中的图层。你最终会得到Future[Option[X]]
。这就是我的意思:
scala> import scala.concurrent._
import scala.concurrent._
scala> import ExecutionContext.Implicits.global
import ExecutionContext.Implicits.global
scala> val f1: Future[Option[Future[Option[String]]]] =
| Future.successful(Some(1)).map(v => Some(Future.successful(Some(v.toString))))
f1: scala.concurrent.Future[Option[scala.concurrent.Future[Option[String]]]] = scala.concurrent.impl.Promise$DefaultPromise@6f900132
scala> val f2: Future[Option[String]] =
| Future.successful(Some(1)).flatMap(v => Future.successful(Some(v.toString)))
f2: scala.concurrent.Future[Option[String]] = scala.concurrent.impl.Promise$DefaultPromise@2fac9a62
对于您的实际上下文,我可能并不完全正确,但您可能会通过替换一些来解决这个问题map
与一些flatMap
s.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)