Scala - 关于元组的Future.sequence

时间:2018-03-06 02:38:57

标签: scala future

我有一个Seq of 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)]]的最佳方式是什么?

2 个答案:

答案 0 :(得分:4)

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

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

此函数 involves 转换输入参数 :)

答案 1 :(得分:2)

使用元组中的future来将每个元组映射到元组的未来, 然后顺序:

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)]]