繁体   English   中英

结合Scala Futures和集合进行理解

[英]Combining Scala Futures and collections in for comprehensions

我正在尝试使用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 }

而我得到的是:

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

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

Future伴侣对象有一个traverse方法,可以完全按照您的意愿执行:

val allTheSquares: Future[List[Int]] =
  Future.traverse(numberList)(squareInTheFuture)

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

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

val allSquaresInTheFuture: Future[List[Int]] =
    Future.traverse(numberList)(squareInTheFuture)

@Lee是对的。 另外,如果您尝试进行并行计算:

  val numberList = List(1, 2, 3)
  val allTheSquares = numberList.par.map(x => x * x)(breakOut)

如果你真的想要Future

val allTheSquares: Future[List[Int]] = Future.traverse(numberList)(squareInTheFuture)

你的理解是一样的

val allTheSquares = numberList.flatMap(number => squareInTheFuture(number))

flatMap要求它的参数函数返回GenTraversableOnce[Int] ,但是你的返回Future[Int] ,因此不匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM