给定此代码将List [Future [T]]转换为Future [List [T]]
def all[T](fs: List[Future[T]]): Future[List[T]] = {
val p = Promise[List[T]]() //create an empty promise which will contain the result (i.e. the future)
p.success(Nil) //initialise: the result of the promise is a Future of an empty list
fs.foldRight(p.future) { //accumulator is the future of the promise
(oneFutueFromTheList, accFutureOfAList) =>
for (
actualValueOfFuture <- oneFutueFromTheList; //unpack the item in the future
theList <- accFutureOfAList //unpack the list from the future
) yield actualValueOfFuture :: theList //append the item to the list
}
}
理解的产量是List [T]。
为什么foldRight会返回Future [List [T]](而不是List [T])?是因为foldRight的累加器是Future [List [T]]而且foldRight是&#34;聪明的&#34;足以知道将产量的结果List [T]放入Future [List [T]]?
代码来源:https://class.coursera.org/reactive-001反应式编程原理
答案 0 :(得分:4)
for comprehension只是flatMaps和map的合成糖,所以这个循环实际上是:
oneFutueFromTheList.flatMap(actualValueOfFuture =>
accFutureOfAList.map(theList =>
actualValueOfFuture :: theList))
foldRight的签名是:foldRight[B](z: B)(op: (A, B) => B): B
foldRight将z作为初始值,并为每个项运行op函数。 op函数应返回Z类型的值,在本例中为List [T]。现在再次运行op函数,这次Z是最后一个op返回值。对于集合中的所有项目,这将继续
foldRight的返回值是从op函数返回的最后一个Z.
答案 1 :(得分:2)
因为p.future
是Future[List[T]]
而foldRight
的签名是foldRight[B](z: B)(op: (A, B) ⇒ B): B
。
在这种情况下,z
为p.future
,因此B
为Future[List[T]]
。