结合Scala Futures和集合进行理解

Joe*_*Joe 6 scala

我正在尝试使用for表达式迭代列表,然后使用返回Future的实用程序对每个元素进行转换.长话短说,它不编译,我想了解原因.我读了这个类似的问题,这是一个很好的帮助,但我想要做的更简单,更令人困惑的是为什么它不起作用.我正在尝试做类似的事情:

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

val numberList = List(1, 2, 3)
def squareInTheFuture(number: Int): Future[Int] = Future { number * number}
val allTheSquares = for {
                          number <- numberList
                          square <- squareInTheFuture(number)
                        } yield { square }
Run Code Online (Sandbox Code Playgroud)

而我得到的是:

错误:类型不匹配; 发现:scala.concurrent.Future [Int] required:scala.collection.GenTraversableOnce [?] square < - squareInTheFuture(number)^

有人可以帮助我理解为什么这不起作用,最好的选择是什么?

Tra*_*own 9

Future同伴对象traverse那不正是你想要的方法:

val allTheSquares: Future[List[Int]] =
  Future.traverse(numberList)(squareInTheFuture)
Run Code Online (Sandbox Code Playgroud)

这将异步启动所有计算并返回一旦所有这些期货完成就将完成的未来.


Ben*_*mes 8

flatMap要求类型构造函数numberListsquareInTheFuture(number)它们相同(模块化集合库所做的任何隐式转换).这不是这种情况.相反,这是一次遍历:

val allSquaresInTheFuture: Future[List[Int]] =
    Future.traverse(numberList)(squareInTheFuture)
Run Code Online (Sandbox Code Playgroud)