scala - 如何在scala中对期货列表执行reduceLeft?
问题描述
val xyz =List(Future(1),Future(2),Future(3),Future(4),Future(5))
xyz.reduceLeft((a,b) => Await.result(a, 1 second) + Await.result(b, 1 second) )
我得到的错误是
error: type mismatch;
found : Int
required: scala.concurrent.Future[Int]
xyz.reduceLeft((a,b) => Await.result(a, 1 second) + Await.result(b, 1 second) )
如何解决这个问题?
解决方案
的 reducer 函数reduceLeft
必须返回与两个参数相同的类型(与列表元素的类型相同)。
所以你需要取两个Future[Int]
并返回一个Future[Int]
。
例如
xyz.reduceLeft( (a,b) => a.flatMap(xa => b.map(xb => xa + xb)) )
最终结果将是一个单一的Future[Int]
,所以你可以Await.result
在最后。
val sum = Await.result(xyz.reduceLeft(....
Future.sequence
您还可以在此处使用标准库函数Seq.sum
:
val sum = Await.result(Future.sequence(xyz).map(_.sum), 1 second)
推荐阅读
- ios - iOS 推送通知:为成千上万的接收用户设置正确徽章的最佳实践
- angular - 如何为 Angular 项目集成覆盖率
- python - 对 C 和 Python 中的缓冲和非缓冲 stdout/stderr 感到困惑
- reactjs - react-beautiful-dnd 测试使用酶,不变失败
- amazon-cloudfront - Cloudfront 给我重定向到 API 的 400 错误
- libcst - 在 Libcst 中向现有的 if elif else 添加额外的 If 节点时出现问题
- google-sheets-formula - 我可以从网页上的用户输入中传递一组权重,以将分数添加到包含这些变量的 Google 表格数据表中吗
- node.js - Heroku 卡住了
- flutter - 如何将 List 转换为 List 的 Map
- javascript - 根本无法让 Websockets / wss 在简单的应用程序上工作