如何在 Scala 中展平期货列表

Posted

技术标签:

【中文标题】如何在 Scala 中展平期货列表【英文标题】:How to flatten a List of Futures in Scala 【发布时间】:2014-12-30 06:52:58 【问题描述】:

我想接受这个验证:

val f = List(Future(1), Future(2), Future(3))

对其进行一些操作(我在想扁平化)

f.flatten

得到这个结果

scala> f.flatten = List(1,2,3)

如果 flatten 方法在这里不合适,那也没关系。只要我得到结果。

谢谢!

【问题讨论】:

如果Futures 之一失败,您希望发生什么? 如果任何一个期货失败了,那么我希望整个事情都失败。这是家庭作业问题的一部分,所以我不想为我解决整个问题。但基本上,我仍然需要弄清楚如何确定是否有任何期货失败,如果失败了,我就干掉整个事情。 【参考方案1】:

Future.sequence 接受 List[Future[T]] 并返回 Future[List[T]]

你可以的

Future.sequence(f) 

然后在其上使用maponComplete 来访问值列表。

【讨论】:

这是我得到的输出: scala.concurrent.Future[List[Int]] = scala.concurrent.impl.Promise$DefaultPromise@3227f076 这是预期的吗?它将 List[Future[T]] 转换为 Future[List[T]]。但我期待类似的东西: scala.concurrent.Future[List[Int]] = Future(List(1,2,3)) 谢谢! 是的,它是Future。现在您可以处理它(地图、使用 onComplete 或任何您想要的)。如果成功,Future 中的结果将是您的列表 Future 通常不会打印其中的内容(这意味着阻塞)。如果您执行Future(1),您将得到类似于scala.concurrent.impl.Promise$DefaultPromise@78393fdb 的内容。对于测试,您可以使用 Await.result(f, 2.seconds) 之类的东西。 @mikejones1477 最好不要阻止。考虑异步处理结果 是的。我不打算阻止我的最终结果。但是为了学习,我想问一下你说的异步是什么意思?

以上是关于如何在 Scala 中展平期货列表的主要内容,如果未能解决你的问题,请参考以下文章

Scala 期货 - 如何在完成时结束?

展平Scala中的元组列表?

Scala 以列表为键、字符串为值的地图展平

在 Scala Akka 期货中,map 和 flatMap 有啥区别?

如何将 Scala 期货与超时联系起来?

如何在Scala中访问嵌套映射中的键值