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

时间:2015-08-11 03:03:30

标签: scala future

Scala从Future[Option[Future[Int]]]转换为Future[Option[Int]]的最简洁方法是什么?它甚至可能吗?

3 个答案:

答案 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需要TraversableOnceOption不会延长。

答案 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]]类型签名,这样您就不必弄清楚如何摆脱它。