排序和遍历期货

在某些情况下,有必要在单独的期货上计算可变数量的价值。假设有一个 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 以提高性能。