【问题标题】:Transforming Seq[(A, Future[B])] into a Future[Map[A,B]] in Scala在 Scala 中将 Seq[(A, Future[B])] 转换为 Future[Map[A,B]]
【发布时间】:2016-02-09 10:42:36
【问题描述】:

我正在寻找一种将Seq[(A, Future[B])] 转换为Future[Map[A,B]] 的简洁方法。有没有好的方法来做到这一点?提前致谢!

【问题讨论】:

    标签: scala future


    【解决方案1】:

    如果你被允许使用 scalaz,那么是的:

    val original:Seq[(String,Future[Int])] = Seq("a" -> Future.successful(1))
    val transformed:Future[Map[String,Int]] = original.toMap.sequenceU
    

    【讨论】:

      【解决方案2】:

      val s = Seq( ("1", f1), ("2", f2) )
      Future.sequence( s.map { case (k ,v) => v.map(fv => (k ,fv)) } ).map(_.toMap)
      

      【讨论】:

        【解决方案3】:

        您可以使用 map 和 flatMap 转换 Futures。使用它,您可以从 Future 开始计算空地图,然后使用 flatMap 和 map 聚合其他期货:

        val s = Seq("A" -> Future {1}, "B" -> Future {2})
        val m = s.foldLeft(Future.successful(Map[String,Int]())){
          case (result, (key, future)) => result.flatMap{
            map => future.map{
              value => map + (key -> value)
            }
          }
        }
        

        【讨论】:

          【解决方案4】:

          这并不难。您需要三个步骤:

           //1. create a list of future tuples
           val futureTuples = Future.map { case (a, futureB) => futureB.map ( a -> _ }
           //2. Transorm it to a future list
           val futureList = Future.sequence(futureTuples)
           //3. Finally, convert list to map:
           val futureMap = futureList.map { _.toMap }
          

          【讨论】:

            猜你喜欢
            • 2020-07-16
            • 2013-07-02
            • 1970-01-01
            • 1970-01-01
            • 2019-09-23
            • 1970-01-01
            • 1970-01-01
            • 2021-01-30
            • 1970-01-01
            相关资源
            最近更新 更多