scala – “未来[选项[未来[选项[X]]]]`进入`未来[选项[X]]`
发布时间:2020-12-16 18:43:57 所属栏目:安全 来源:网络整理
导读:如何将Future [Option [Future [Option [X]]]]转换为Future [Option [X]]? 如果它是TraversableOnce而不是Option我会使用Future companion object;但是选项怎么样? 例: def processAndReturnFuture(x:String):Future[String] = future(x)def processAgain
如何将Future [Option [Future [Option [X]]]]转换为Future [Option [X]]?
如果它是TraversableOnce而不是Option我会使用Future companion object;但是选项怎么样? 例: 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) ) ) ) 解决方法
更新的答案
这可能会成功.我所做的是用最外层Future上的flatMap替换前两个map调用,并在最外面的Option上替换模式匹配. val futOptFutOpt: Future[Option[String]] = futOpt.flatMap { case None => Future.successful(None) case Some(x) => processAndReturnFuture(x).map { processedX => processAgainAndReturnOption(processedX) } } 初步答复 我假设你的代码中有一个地图调用,它将Future [Option [A]]转换为Future [Option [Future [Option [X]]]].用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 关于你的实际情况我可能并不完全正确,但你可能会用一些flatMaps替换一些地图来解决这个问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |