2016-06-01 3 views
1

In Scala möchte ich eine Variable vom Typ List[Future[T]] in Future[List[T]] umwandeln.Wie funktioniert Future.sequence?

Ich weiß, ich kann Future.sequence verwenden.

Wie ist Future.sequence implementiert obwohl?

+1

Es ist im Grunde ein "foldLeft" mit einer erfolgreichen Zukunft als Akku, überprüfen Sie einfach den Quellcode von 'Future.scala'. –

+0

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

+0

Bevor Sie suchen, warum nicht versuchen, auf eigene Faust zu implementieren? –

Antwort

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

Es schafft einen Samen Future für foldLeftPromise.successful verwendet, und verwendet dann einen CanBuildFrom alle Futures in eine Folge zu akkumulieren, um das Ergebnis der Akkumulierung am Ende ergibt.

+1

Wenn Sie von "CanBuildFrom" wie ich verwirrt sind, dann empfehle ich Kapitel 25 von [Programmierung in Scala] (http://www.artima.com/shop/programming_in_scala_3ed). –