排序和遍歷期貨
在某些情況下,有必要在單獨的期貨上計算可變數量的價值。假設有一個 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]]
,限制為 F
和 G
。
有一個名為 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 以提高效能。