排序和遍歷期貨

在某些情況下,有必要在單獨的期貨上計算可變數量的價值。假設有一個 List[Future[Int]],但需要處理 List[Int]。那麼問題是如何將這個 List[Future[Int]] 例項變成一個 Future[List[Int]]。為此目的,在 Future 伴侶物件上有 sequence 方法。

def listOfFuture: List[Future[Int]] = List(1,2,3).map(Future(_))
def futureOfList: Future[List[Int]] = Future.sequence(listOfFuture)

一般來說,sequence 是函數語言程式設計領域中眾所周知的運算子,它將 F[G[T]] 轉換為 G[F[T]],限制為 FG

有一個名為 traverse 的替代運算子,它的工作方式類似但是將函式作為額外的引數。使用身份函式 x => x 作為引數,它的行為類似於 sequence 運算子。

def listOfFuture: List[Future[Int]] = List(1,2,3).map(Future(_))
def futureOfList: Future[List[Int]] = Future.traverse(listOfFuture)(x => x)

但是,額外引數允許修改給定 listOfFuture 中的每個未來例項。此外,第一個引數不需要是 Future 的列表。因此可以將示例轉換如下:

def futureOfList: Future[List[Int]] = Future.traverse(List(1,2,3))(Future(_))

在這種情況下,List(1,2,3) 直接作為第一個引數傳遞,並且身份函式 x => x 被替換為函式 Future(_),以類似地將每個 Int 值包裝到 Future 中。這樣做的一個優點是可以省略中間裝置 22 以提高效能。