什么是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但不会扩展.