【发布时间】:2015-12-12 20:38:26
【问题描述】:
我想我了解未来组合的工作原理,但我很困惑如何根据第一个未来的响应块调用下一个未来。 假设第一个未来返回一个整数列表并且列表很大。我想一次将一些函数应用于该列表,其中包含 2 个元素。我该怎么做?
这个例子总结了我的困境:
val a = Future(List(1,2,3,4,5,6))
def f(a: List[Int]) = Future(a map (_ + 2))
val res = for {
list <- a
chunked <- list.grouped(2).toList
} yield f(chunked)
<console>:14: error: type mismatch;
found : List[scala.concurrent.Future[List[Int]]]
required: scala.concurrent.Future[?]
chunked <- list.grouped(2).toList
^
返回类型必须是 Future[?] 所以我可以通过将第二个 future 移动到 yield 部分来修复它:
val res = for {
list <- a
} yield {
val temp = for {
chunked <- list.grouped(2).toList
} yield f(chunked)
Future.sequence(temp)
}
我觉得它现在失去了它的优雅,因为它变成了嵌套的(见两个理解而不是第一种方法中的一个)。有没有更好的方法来达到同样的效果?
【问题讨论】:
标签: scala