隨着大List[Int]
,我決定使用List#grouped(Int)
得到List[List[Int]]
。然後,我將其映射到應用函數List[Int] => Future[List[Int]]
。我的意圖是同時將一個職能應用於子列表。列表[未來[列表[Int]]]列表[Int]
現在我有List[scala.concurrent.Future[List[Int]]]
。
鑑於此類型,我想獲得List[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