【问题标题】:Combining Scala Futures and collections in for comprehensions将 Scala 期货和集合结合起来进行理解
【发布时间】:2019-10-06 16:21:48
【问题描述】:

我正在尝试使用 for 表达式遍历列表,然后使用返回 Future 的实用程序对每个元素进行转换。长话短说,它无法编译,我想了解原因。我读了this question,这很相似,而且很有帮助,但我想做的甚至更简单,这对于为什么它不起作用更加令人困惑。我正在尝试做类似的事情:

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] 必需:scala.collection.GenTraversableOnce[?] 方格

谁能帮我理解为什么这不起作用以及最好的选择是什么?

【问题讨论】:

    标签: scala


    【解决方案1】:

    Future companion object 有一个 traverse 方法可以完全满足您的需求:

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

    这将异步启动所有计算并返回一个将在所有这些未来完成后完成的未来。

    【讨论】:

      【解决方案2】:

      flatMap 要求numberListsquareInTheFuture(number) 的类型构造函数相同(无论集合库执行的隐式转换如何)。这不是这里的情况。相反,这是一个遍历:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          你的理解和理解是一样的

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-17
            • 1970-01-01
            • 2018-06-13
            • 1970-01-01
            • 2017-03-26
            相关资源
            最近更新 更多