如果List[Int]
很大,我决定使用List#grouped(Int)
获取List[List[Int]]
。然后,我使用函数List[Int] => Future[List[Int]]
映射它。我的目的是将一个函数同时应用于子列表。
现在我有List[scala.concurrent.Future[List[Int]]]
。
鉴于该类型,我希望List[Int]
收集结果。
这样做的惯用方法是什么?
答案 0 :(得分:7)
我假设您的意思是Future[List[Int]]
,而不仅仅是List[Int]
。在这种情况下,您可以使用Future.sequence
将List[Future[A]]
映射到Future[List[A]]
,然后flatten
将List
映射到单Future
。
val list: List[Future[List[Int]]] = ...
Future.sequence(list).map(_.flatten)
如果由于某种原因只想删除Future
,那么你需要阻止才能获得它。
Await.result(Future.sequence(list).map(_.flatten), Duration.Inf)
答案 1 :(得分:1)
@ m-z建议的sequence
方法可行,但酷/惯用的方法是使用scalaz的traverseM
代替map
和函数:
def myFunction(li: List[Int]): Future[List[Int]] = ...
val myList: List[List[Int]] = ...
import scalaz._, Scalaz._
myList.traverseM(myFunction) //returns a Future[List[Int]]
答案 2 :(得分:0)
val futures = List[Future[List[Int]]]
Future.fold(futures)(List.empty) { (l, r) =>
l ++ r
} onComplete {
case Success(r) => println(r)
case Failure(e) => e.printStackTrace()
}