我有一个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)]]
的最佳方式是什么?
答案 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)} }
)
从内部术语到外部术语一步一步:
map
将Future("X")
转换为Future(("A", "X"))
。map
会将每个("A", Future("X"))
转换为Future(("A", "X"))
,从而为您提供Seq[Future[(String, String)]]
。 sequence
来获取Future[Seq[(String, String)]]