如何在Scala中展开Future列表

38

我想取这个值:

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

对其执行某些操作(我在考虑压平操作)

f.flatten

并获得这个结果

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

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

谢谢!


如果其中一个“Future”失败了,您希望发生什么? - Michael Zajac
如果任何一个未来失败,那么我希望整个事情都失败。这是作业问题的一部分,所以我不是想让别人替我解决整个问题。但基本上,我仍然需要弄清楚如何确定是否有任何未来失败,如果他们失败了,我就终止整个事情。 - mljohns89
1个回答

81

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

你可以这样做:

Future.sequence(f) 

然后使用maponComplete来访问该值列表。


1
这是我得到的输出: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))谢谢! - mljohns89
是的,这是一个“Future”。现在你可以处理它(无论是映射、使用onComplete还是其他任何方式)。如果成功,Future中的结果将是你的列表。 - Gabriele Petronella
1
Future 通常不会打印其内部内容(这意味着阻塞)。如果您执行 Future(1),您将得到类似于 scala.concurrent.impl.Promise$DefaultPromise@78393fdb 的东西。对于测试,您可以使用类似于 Await.result(f, 2.seconds) 的东西。 - lmm
1
@mikejones1477,通常最好不要阻塞。考虑异步处理结果。 - Gabriele Petronella
是的。我原本并没有打算为我的最终结果设置阻塞。但出于学习的目的,我想问一下您异步的意思是什么? - mljohns89
我的意思是以非阻塞的方式。对于未来的映射已经是异步的,因为如果计算成功,代码最终将在未来运行。 - Gabriele Petronella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接