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)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |