Scala混合清单和期货用于补充

时间:2017-07-31 09:28:14

标签: scala scalaz

我想混合列表和期货进行综合

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)

任何简化它的建议?

1 个答案:

答案 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]] !