簡體   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