怎么会Future[Option[X]]变成Option[Future[X]]?
val futOpt:Future[Option[Int]] = future(Some(1))
val optFut:Option[Future[Int]] = ?
Run Code Online (Sandbox Code Playgroud)
更新:
这是对这个问题的跟进.我想我正试图抓住优雅地改造嵌套的未来.我试图与实现Option叫什么是可以做到Sequences,在那里你转Future[Seq[Future[Seq[X]]]]成Future[Future[Seq[Seq[x]]]],然后flatMap将双层.正如Ionut澄清的那样,我已经按照翻转的顺序表达了这个问题,它应该是Option[Future[X]]- > Future[Option[X]].
Ion*_*tan 31
不幸的是,如果不失去计算的非阻塞属性,这是不可能的.如果你想一想就很简单.你不知道计算的结果是否None或Some直到Future已经完成,所以你要Await就可以了.那时,再也没有意义Future了.您可以简单地返回Option[X],因为Future已经完成了.
看看这里.它总是返回Future.successful,没有计算,只是包装o在一个Future没有充分理由.
def transform[A](f: Future[Option[A]]): Option[Future[A]] =
Await.result(f, 2.seconds).map(o => Future.successful(o))
Run Code Online (Sandbox Code Playgroud)
所以,如果在你的上下文中有意义阻止,你最好使用它:
def transform[A](f: Future[Option[A]]): Option[A] =
Await.result(f, 2.seconds)
Run Code Online (Sandbox Code Playgroud)
回复评论:
def transform[A](o: Option[Future[A]]): Future[Option[A]] =
o.map(f => f.map(Option(_))).getOrElse(Future.successful(None))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5414 次 |
| 最近记录: |