如何在 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 方法在这里不合适,那也没关系。只要我得到结果。
谢谢!
【问题讨论】:
如果Future
s 之一失败,您希望发生什么?
如果任何一个期货失败了,那么我希望整个事情都失败。这是家庭作业问题的一部分,所以我不想为我解决整个问题。但基本上,我仍然需要弄清楚如何确定是否有任何期货失败,如果失败了,我就干掉整个事情。
【参考方案1】:
Future.sequence
接受 List[Future[T]]
并返回 Future[List[T]]
。
你可以的
Future.sequence(f)
然后在其上使用map
或onComplete
来访问值列表。
【讨论】:
这是我得到的输出: 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 中展平期货列表的主要内容,如果未能解决你的问题,请参考以下文章