列表[Future [List [Int]]]到List [Int]

时间:2015-02-10 18:12:20

标签: scala

如果List[Int]很大,我决定使用List#grouped(Int)获取List[List[Int]]。然后,我使用函数List[Int] => Future[List[Int]]映射它。我的目的是将一个函数同时应用于子列表。

现在我有List[scala.concurrent.Future[List[Int]]]

鉴于该类型,我希望List[Int]收集结果。

这样做的惯用方法是什么?

3 个答案:

答案 0 :(得分:7)

我假设您的意思是Future[List[Int]],而不仅仅是List[Int]。在这种情况下,您可以使用Future.sequenceList[Future[A]]映射到Future[List[A]],然后flattenList映射到单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()
}