2015-02-10 120 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]]