Ala*_*ano 3 concurrency scala future
我有一个功能,需要期货Future[A]*
,我希望它返回一个Future[List[A]]
.
def singleFuture[T](futures: List[Future[A]]): Future[List[A]] = {
val p = Promise[T]
futures filter { _ onComplete { case x => p complete x /*????*/ } }
p.future
}
Run Code Online (Sandbox Code Playgroud)
而且我还希望类型的未来类型Future[List[A]]
在列表期货完成后立即List[Future[A]]
完成.
该代码不起作用.我想我应该flatMap
在这里使用,因为应该有2个内部循环:一个用于未来,一个用于promise.但是怎么样?
我想不能用的理解,因为我想了解的过程中,在更深一层意义上这里.
这已经为您实现:
def singleFuture[T](futures: List[Future[A]]): Future[List[A]] = Future.sequence(futures)
Run Code Online (Sandbox Code Playgroud)
当然,您可以查看序列的实现:
def sequence[A, M[_] <: TraversableOnce[_]](in: M[Future[A]])(implicit cbf: CanBuildFrom[M[Future[A]], A, M[A]], executor: ExecutionContext): Future[M[A]] = {
in.foldLeft(Promise.successful(cbf(in)).future) {
(fr, fa) => for (r <- fr; a <- fa.asInstanceOf[Future[A]]) yield (r += a)
} map (_.result())
}
Run Code Online (Sandbox Code Playgroud)
如果你只想处理列表,而不是任何有foldLeft的东西,这可以简化:
def sequence[A](in: List[Future[A]]): Future[List[A]] = {
in.foldRight[Future[List[A]](Promise.successful(Nil) {
(fa, fr) => for { r <- fr; a <- fa } yield (a :: r)
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1787 次 |
最近记录: |