【问题标题】:Scala - Future.sequence on TuplesScala - 元组上的 Future.sequence
【发布时间】:2018-08-13 19:46:01
【问题描述】:

我有一个元组序列:

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)]] 的最佳方式是什么?

【问题讨论】:

    标签: scala future


    【解决方案1】:

    使用元组中的future首先将每个元组映射到元组的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)]]

    【讨论】:

      【解决方案2】:

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

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

      这个函数involves转换输入参数:)

      【讨论】:

        猜你喜欢
        • 2021-03-19
        • 2018-09-30
        • 2020-06-15
        • 1970-01-01
        • 2021-07-18
        • 2015-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多