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)} }
)
循序渐进,从内项到外项:
- 内部
map
将Future("X")
转换为Future(("A", "X"))
。
- 外层
map
将每个 ("A", Future("X"))
转换为一个 Future(("A", "X"))
,从而得到一个 Seq[Future[(String, String)]]
。
- 现在你可以使用
sequence
获得 Future[Seq[(String, String)]]
这里给出的答案很好,但我认为 Future.traverse
在这里会更简洁:
Future.traverse(seqTuple) {
case (s1, s2Future) => s2Future.map{ s2 => (s1, s2) }
}
这个函数involves转换输入参数:)
我有一个元组序列:
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)} }
)
循序渐进,从内项到外项:
- 内部
map
将Future("X")
转换为Future(("A", "X"))
。 - 外层
map
将每个("A", Future("X"))
转换为一个Future(("A", "X"))
,从而得到一个Seq[Future[(String, String)]]
。 - 现在你可以使用
sequence
获得Future[Seq[(String, String)]]
这里给出的答案很好,但我认为 Future.traverse
在这里会更简洁:
Future.traverse(seqTuple) {
case (s1, s2Future) => s2Future.map{ s2 => (s1, s2) }
}
这个函数involves转换输入参数:)