Scala从Future[Option[Future[Int]]]
转换为Future[Option[Int]]
的最简洁方法是什么?它甚至可能吗?
答案 0 :(得分:9)
您有两个嵌套的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(_))
})
或者,更简洁:
def flatten[A](f: Future[Option[Future[A]]]): Future[Option[A]] =
f.flatMap(o => Future.sequence(o.toSeq).map(_.headOption))
感谢@ lmm关于这个想法的答案。理想情况下,这可以写为f.flatMap(Future.sequence)
,但不幸的是sequence
需要TraversableOnce
,Option
不会延长。
答案 1 :(得分:1)
最干净的方法可能是使用scalaz:
import scalaz.std.option._
import scalaz.std.scalaFuture._
import scalaz.syntax.traverse._
//assuming implicit execution context in scope
f.flatMap(_.sequence)
答案 2 :(得分:0)
你问的是如何用一些纸袋编写你的方法,你已经得到了一些关于如何做到这一点的好答案,但你应该退后一步,试着不要进入你目前所处的纸袋请参阅我的答案:Get rid of Scala Future nesting关于如何避免进入Future [X [Future [y]]类型签名,这样您就不必弄清楚如何摆脱它。