我想混合列表和期货进行综合
val list: List[Int] = List(1,2,3)
def f1(i: Int): Future[Boolean] = ???
def f2(i: Int): Future[List[Int]] = ???
查看this answer 如果我将列表与未来的ans转换为f返回类型到List
,这可以正常工作import scalaz._
import ListT._
val x: Future[List[Boolean]] = (for {
i <- listT(Future{ls})
c <- listT(f2(i))
b <- listT(f1(c).map(List(_)))
} yield b).run
我要找的输出应该是Future[List[Boolean]]
然而,使用Future包含所有这些列表并将boolean转换为list似乎效率低下。我不得不使用另一个库(scalaz)
任何简化它的建议?
答案 0 :(得分:2)
使用Future.sequence运算符将期货的Seq映射到Seq的未来:
val x: Future[List[Boolean]] = Future.sequence(list.map(f2)) // Change List[Future[List[Int]]] to Future[List[List[Int]]]
.map(_.flatten) // to Future[List[Int]]
.flatMap(list => Future.sequence(list.map(f1))) // map the new list when available to List[Future[Boolean]], and Future.sequence that to Future[List[Boolean]] !