未来[选项[Future [Int]]]到未来[Option [Int]]

Chr*_*art 3 scala future

什么是Scala中最干净的方法,从转换Future[Option[Future[Int]]]Future[Option[Int]]?它甚至可能吗?

Chr*_*tin 11

你有两个嵌套的嵌套Future,所以这需要一个flatMap.

def flatten[A](f: Future[Option[Future[A]]]): Future[Option[A]] =
  f.flatMap({
    case None => Future.successful(None)
    case Some(g) => g.map(Some(_))
  })
Run Code Online (Sandbox Code Playgroud)

或者,更简洁:

def flatten[A](f: Future[Option[Future[A]]]): Future[Option[A]] =
  f.flatMap(o => Future.sequence(o.toSeq).map(_.headOption))
Run Code Online (Sandbox Code Playgroud)

感谢@ lmm的回答.理想情况下,这可以写成f.flatMap(Future.sequence),但不幸的是sequence期望a TraversableOnce,Option但不会扩展.