在Scala中,我想将List[Future[T]]
类型的变量转换为Future[List[T]]
。
我知道我可以使用Future.sequence
。
如何实施Future.sequence
?
答案 0 :(得分:1)
/** 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)
}
使用Future
为foldLeft
创建种子Promise.successful
,然后使用CanBuildFrom
将所有未来累积到序列中,从而产生积累的结果端。