我有一个元组序列:
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)]]
什么?
使用元组中的Future将每个元组首先映射到元组的Future,然后排序:
Future.sequence(
seqTuple.map{case (s1, fut_s2) => fut_s2.map{s2 => (s1, s2)} }
)
Run Code Online (Sandbox Code Playgroud)
从内部术语到外部术语,逐步:
map
转换Future("X")
为Future(("A", "X"))
。map
将每个("A", Future("X"))
转换为Future(("A", "X"))
,从而为您提供Seq[Future[(String, String)]]
。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)
该函数涉及转换输入参数:)