在Scala中,从Future [Option [Future [Int]]]
转换为Future [Option [Int]]
的最干净的方法是什么?是否可能?
有两个嵌套的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
并没有扩展它。
最干净的方法可能是使用scalaz:
import scalaz.std.option._
import scalaz.std.scalaFuture._
import scalaz.syntax.traverse._
//assuming implicit execution context in scope
f.flatMap(_.sequence)
OptionT [Task,Int]
会对您有所帮助。相关链接:https://dev59.com/QmYq5IYBdhLWcg3wjBUM#14386670 - Chris Martin