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