列表[未来[列表[Int]]]列表[Int]
问题描述:
随着大List[Int]
,我决定使用List#grouped(Int)
得到List[List[Int]]
。然后,我将其映射到应用函数List[Int] => Future[List[Int]]
。我的意图是同时将一个职能应用于子列表。列表[未来[列表[Int]]]列表[Int]
现在我有List[scala.concurrent.Future[List[Int]]]
。
鉴于此类型,我想获得List[Int]
以收集结果。
这样做的惯用方法是什么?
答
我假设你的意思是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)
答
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()
}
答
的sequence
方法,通过@提出M-ž的工作,但凉爽/惯用的方式做到这一点是使用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]]
感谢。正如你所指出的,“顺序”是我的问题的关键。每个[Typeclassopedia]的序列:: Monad m => [m a] - > m [a]'(https://wiki.haskell.org/Typeclassopedia?) – 2015-02-10 18:25:02