Scala-元组上的Future.sequence

Tan*_*vir 2 scala future

我有一个元组序列:

val seqTuple: Seq[(String, Future[String])] = Seq(("A", Future("X")), ("B", Future("Y")))
Run Code Online (Sandbox Code Playgroud)

我想得到:

val futureSeqTuple: Future[Seq[(String, String)]] = Future(Seq(("A", "X"), ("B", "Y")))
Run Code Online (Sandbox Code Playgroud)

我知道我可以做:

val futureSeq: Future[Seq[String]] = Future.sequence(seqTuple.map(_._2))
Run Code Online (Sandbox Code Playgroud)

但是我丢失了元组中的第一个String。

拿到最好的方法是Future[Seq[(String, String)]]什么?

And*_*kin 5

使用元组中的Future将每个元组首先映射到元组的Future,然后排序:

Future.sequence(
  seqTuple.map{case (s1, fut_s2) => fut_s2.map{s2 => (s1, s2)} }
)
Run Code Online (Sandbox Code Playgroud)

从内部术语到外部术语,逐步:

  1. 内部map转换Future("X")Future(("A", "X"))
  2. 外部map将每个("A", Future("X"))转换为Future(("A", "X")),从而为您提供Seq[Future[(String, String)]]
  3. 现在您可以使用sequence它来获取Future[Seq[(String, String)]]


小智 5

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

Future.traverse(seqTuple) {
  case (s1, s2Future) => s2Future.map{ s2 => (s1, s2) }
}
Run Code Online (Sandbox Code Playgroud)

该函数涉及转换输入参数:)