简体   繁体   English

Scala - 元组上的 Future.sequence

[英]Scala - Future.sequence on Tuples

I have a Seq of Tuples:我有一个元组序列:

val seqTuple: Seq[(String, Future[String])] = Seq(("A", Future("X")), ("B", Future("Y")))

and I want to get:我想得到:

val futureSeqTuple: Future[Seq[(String, String)]] = Future(Seq(("A", "X"), ("B", "Y")))

I know I can do:我知道我能做到:

val futureSeq: Future[Seq[String]] = Future.sequence(seqTuple.map(_._2))

but I am losing the first String in the Tuple.但我丢失了元组中的第一个字符串。

What is the best way to get a Future[Seq[(String, String)]] ?获得Future[Seq[(String, String)]]的最佳方法是什么?

Use the futures in tuples to map each tuple to future of tuple first, then sequence:首先使用元组中的未来将每个元组映射到元组的未来,然后是序列:

Future.sequence(
  seqTuple.map{case (s1, fut_s2) => fut_s2.map{s2 => (s1, s2)} }
)

Step by step, from inner terms to outer terms:一步一步,从内项到外项:

  1. The inner map converts Future("X") to Future(("A", "X")) .内部mapFuture("X")转换为Future(("A", "X"))
  2. The outer map converts each ("A", Future("X")) into an Future(("A", "X")) , thus giving you a Seq[Future[(String, String)]] .外部map将每个("A", Future("X"))转换为Future(("A", "X")) ,从而为您提供Seq[Future[(String, String)]]
  3. Now you can use sequence on that to obtain Future[Seq[(String, String)]]现在你可以使用sequence来获得Future[Seq[(String, String)]]

The answer given here works fine, but I think Future.traverse would work more succinctly here:这里给出的答案很好,但我认为Future.traverse在这里会更简洁:

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

This function involves converting the input argument:)此函数涉及转换输入参数:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM