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?
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?
/** 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 foldLeft
Promise.successful
verwendet, und verwendet dann einen CanBuildFrom
alle Futures in eine Folge zu akkumulieren, um das Ergebnis der Akkumulierung am Ende ergibt.
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). –
Es ist im Grunde ein "foldLeft" mit einer erfolgreichen Zukunft als Akku, überprüfen Sie einfach den Quellcode von 'Future.scala'. –
https://github.com/scala/scala/blob/2.12.x/src/library/scala/concurrent/Future.scala#L663 –
Bevor Sie suchen, warum nicht versuchen, auf eigene Faust zu implementieren? –