2015-02-10 174 views
1

隨着大List[Int],我決定使用List#grouped(Int)得到List[List[Int]]。然後,我將其映射到應用函數List[Int] => Future[List[Int]]。我的意圖是同時將一個職能應用於子列表。列表[未來[列表[Int]]]列表[Int]

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

鑑於此類型,我想獲得List[Int]以收集結果。

這樣做的慣用方法是什麼?

回答

7

我假設你的意思是Future[List[Int]]而不僅僅是List[Int]。在這種情況下,您將使用Future.sequence來映射List[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

感謝。正如你所指出的,「順序」是我的問題的關鍵。每個[Typeclassopedia]的序列:: Monad m => [m a] - > m [a]'(https://wiki.haskell.org/Typeclassopedia?) – 2015-02-10 18:25:02

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() 
} 
1

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