Scala - Future.sequence 元组

Scala - Future.sequence on Tuples

我有一个元组序列:

val seqTuple: Seq[(String, Future[String])] = Seq(("A", Future("X")), ("B", Future("Y")))

我想得到:

val futureSeqTuple: Future[Seq[(String, String)]] = Future(Seq(("A", "X"), ("B", "Y")))

我知道我能做到:

val futureSeq: Future[Seq[String]] = Future.sequence(seqTuple.map(_._2))

但我丢失了元组中的第一个字符串。

获得 Future[Seq[(String, String)]] 的最佳方法是什么?

首先使用元组中的未来将每个元组映射到元组的未来, 然后序列:

Future.sequence(
  seqTuple.map{case (s1, fut_s2) => fut_s2.map{s2 => (s1, s2)} }
)

循序渐进,从内项到外项:

  1. 内部mapFuture("X")转换为Future(("A", "X"))
  2. 外层 map 将每个 ("A", Future("X")) 转换为一个 Future(("A", "X")),从而得到一个 Seq[Future[(String, String)]]
  3. 现在你可以使用 sequence 获得 Future[Seq[(String, String)]]

这里给出的答案很好,但我认为 Future.traverse 在这里会更简洁:

Future.traverse(seqTuple) {
  case (s1, s2Future) => s2Future.map{ s2 => (s1, s2) }
}

这个函数involves转换输入参数:)