[英]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
要求numberList
和squareInTheFuture(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.