首页 > 解决方案 > 如何在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) )

如何解决这个问题?

标签: scala

解决方案


的 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)

推荐阅读