scala - 计算 future 列表并返回结果 future

标签 scala concurrency future

我有一个接收 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
} 

而且我还想要类型 Future[List[A]] 的结果 future 挂牌 future 后立即完成List[Future[A]]已经完成。

该代码不起作用。我想我应该使用 flatMap因为应该有 2 个内部循环:一个用于 future ,一个用于 promise 。但是如何?

我不想用 在这里理解是因为我想了解更深层次的过程。

最佳答案

这已经为您实现了:

def singleFuture[T](futures: List[Future[A]]): Future[List[A]] = Future.sequence(futures)

当然,你可以看看sequence的实现:
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())
}

如果你只想处理列表,而不是任何有 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)
  }
}

关于scala - 计算 future 列表并返回结果 future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20278133/

相关文章:

scala - 限制 Scalatest 并行执行线程数

scala - 在单独的库中使用 Akka

scala - 如何在 Scala 中实现 DAO?

java - 具有容器管理事务的单例 EJB 并发

python - 如何以编程方式并发驱动 Ansible?

scala - 为什么 `Future#toString` 返回 `"列表( )"` ?

scala - 将字符串 RDD 转换为 Int RDD

java - 具有条目驱逐的并发阻塞映射

scala - Future[Either[A, B]] 到 Future[Either[A, C]] 使用 (B => Future[C]) 函数

java - 如何正确使用线程池并从线程中获取结果?