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

scala – 将`Future [Option [X]]`转换成`Option [Future [X]]`

发布时间:2020-12-16 19:02:17 所属栏目:安全 来源:网络整理
导读:如何将未来[选项[X]]转换为选项[未来[X]]? val futOpt:Future[Option[Int]] = future(Some(1))val optFut:Option[Future[Int]] = ? 更新: 这是跟随到this question.我想我想抓住优雅地转变嵌套的期货.我试图通过选项实现Sequences,你将未来[Seq [Future [S
如何将未来[选项[X]]转换为选项[未来[X]]?

val futOpt:Future[Option[Int]] = future(Some(1))
val optFut:Option[Future[Int]] = ?

更新:

这是跟随到this question.我想我想抓住优雅地转变嵌套的期货.我试图通过选项实现Sequences,你将未来[Seq [Future [Seq [X]]]]转化为未来[未来[Seq [Seq [x]]]],然后flatMap双层.由于Ionut已经澄清,我已经按照顺序排列了这个问题,它应该是Option [Future [X]] – >未来[选项[X]].

解决方法

不幸的是,这是不可能的,而不会失去计算的非阻塞属性.这很简单,如果你考虑它.您不知道计算结果是否为“否”或“某些”,直到“未来”完成,因此您必须等待它.在这一点上,再一次有未来是没有意义的.您可以简单地返回选项[X],因为未来已经完成.

看看这里.它总是返回Future.successful,没有计算,只是在未来的包装o没有好的理由.

def transform[A](f: Future[Option[A]]): Option[Future[A]] =
  Await.result(f,2.seconds).map(o => Future.successful(o))

所以,如果在你的上下文中有意义的阻止,你最好使用这个:

def transform[A](f: Future[Option[A]]): Option[A] =
  Await.result(f,2.seconds)

回应意见:

def transform[A](o: Option[Future[A]]): Future[Option[A]] =
  o.map(f => f.map(Option(_))).getOrElse(Future.successful(None))

(编辑:李大同)

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

    推荐文章
      热点阅读