Scala 我如何撰写“未来”列表?

Scala 我如何撰写“未来”列表?,scala,future,Scala,Future,我有一系列的承诺。我一直在寻找一种有效的方法来撰写最终的期货。目前,我发现组合它们最干净的方法是使用scalazMonoid,如下所示: val promises = List(Promise[Unit], Promise[Unit], Promise[Unit]) promises.map(_.future).reduce(_ |+| _).onSuccess { case a => println(a) } promises.foreach(_.succ

我有一系列的
承诺
。我一直在寻找一种有效的方法来撰写最终的
期货
。目前,我发现组合它们最干净的方法是使用scalaz
Monoid
,如下所示:

  val promises = List(Promise[Unit], Promise[Unit], Promise[Unit])

  promises.map(_.future).reduce(_ |+| _).onSuccess {
    case a => println(a)
  }  

  promises.foreach(_.success(()))
有没有一种不需要scalaz的干净方法


集合中的
未来
数量会有所不同,大量中间集合是不可取的。

未来。顺序
是您想要的方法。

您可以使用
未来。遍历

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{ Future, Promise }

val promises = List(Promise[Unit], Promise[Unit], Promise[Unit])
Future.traverse(promises)(_.future)
这将为您提供一个
未来的[List[Unit]]
,它并不完全符合“大量中间集合”的条件,但也不一定理想<代码>未来。reduce也适用于:

Future.reduce(promises.map(_.future))((_, _) => ())

这将返回一个
Future[Unit]
,当所有的期货都满足时,它将得到满足。

您是否介意将
期货
聚合,而不是
承诺
?这就是我在这里所做的,我使用.map()
Future.traverse来提取期货可能更有意义(参见我的答案),但仍然会创建至少一个不必要的中间集合。序列简化了遍历,所以你们都是对的,但我只能接受一个。抱歉。在这种情况下,
遍历实际上既简单又高效,它将必要的
映射
序列
组合到一个操作中。根据我上面做的非常糟糕的基准,它们几乎相等。考虑到它构建了一个集合,我想知道monoid是否更有效。但是谢谢,这正是我想要的——显然我不知道如何使用API文档,因为我从来没有点击过Future的对象版本。
reduce
不会创建集合,所以它至少应该和monoid一样有效(可能更有效)。是的,我在上面的示例中使用reduce,速度是否更快取决于您用什么替换了
++
。遍历将创建一个列表,因此我认为这可能会引入一些小开销。我只有少量的期货,所以名单很短,可能不重要。你在
list
上使用
reduce
,这与
Future
上的不同,但对了,差异可能不重要。我创建了一个包含一百万个双重承诺的名单,使用这两种技术和遍历+求和完成它们的时间比reduce+幺半群快20%——我认为这与两个间接层次有关(它必须组成未来和双幺半群)。