在某些情况下,有必要在单独的期货上计算可变数量的价值。假设有一个List[Future[Int]],但是List[Int]需要处理。然后的问题是如何将的实例List[Future[Int]]转换为Future[List[Int]]。为此sequence,在Future伴随对象上有方法。
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)直接作为第一个参数传递,并将identity函数x => x替换为将该函数Future(_)类似地包装Int到a中的函数Future。这样做的优点是List[Future[Int]]可以省略中介以提高性能。