2016-06-01 5 views
1

Scalaでは、タイプList[Future[T]]の変数をFuture[List[T]]に変換したいと考えています。Future.sequenceはどのように機能しますか?

Future.sequenceを使用することができます。

Future.sequenceはどのように実装されていますか?

+1

基本的に 'foldLeft'はアキュムレータとして成功し、' Future.scala'のソースコードをチェックします。 –

+0

https://github.com/scala/scala/blob/2.12.x/​​src/library/scala/concurrent/Future.scala#L663 –

+0

ご覧になる前に、自分で実装しようとしないのはなぜですか? –

答えて

1

Like this

/** Simple version of `Futures.traverse`. 
* Transforms a `TraversableOnce[Future[A]]` into a `Future[TraversableOnce[A]]`. 
* Useful for reducing many `Future`s into a single `Future`. 
*/ 
def sequence[A, M[X] <: TraversableOnce[X]] 
      (in: M[Future[A]]) 
      (implicit cbf: CanBuildFrom[M[Future[A]], A, M[A]], 
      executor: ExecutionContext): Future[M[A]] = { 
    in.foldLeft(successful(cbf(in))) { 
    (fr, fa) => for (r <- fr; a <- fa) yield (r += a) 
    }.map(_.result())(InternalCallbackExecutor) 
} 

それはPromise.successfulを用いfoldLeftためのシードFutureを作成し、終了時に累積の結果をもたらす、配列内のすべての先物を蓄積するCanBuildFromを使用します。

+1

私が行ったように 'CanBuildFrom'と混乱しているなら、[Programming in Scala](http://www.artima.com/shop/programming_in_scala_3ed)の第25章をお勧めします。 –

関連する問題