Scala 混合列表和期货以供理解

Scala mix list and futures in for comprehention

我想将列表和期货混合在一起以便理解

val list: List[Int] = List(1,2,3)
def f1(i: Int): Future[Boolean] = ???
def f2(i: Int): Future[List[Int]] = ???

看着 如果我用 future ans 将 f return 类型换成 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 包装列表并将布尔值转换为列表似乎效率低下。我不得不使用另一个库 (scalaz)

有什么简化的建议吗?

使用 Future.sequence 运算符将 Futures 的 Seq 映射到 Seq 的 Future :

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