加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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替换一些地图来解决这个问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读