【发布时间】:2016-02-09 10:42:36
【问题描述】:
我正在寻找一种将Seq[(A, Future[B])] 转换为Future[Map[A,B]] 的简洁方法。有没有好的方法来做到这一点?提前致谢!
【问题讨论】:
我正在寻找一种将Seq[(A, Future[B])] 转换为Future[Map[A,B]] 的简洁方法。有没有好的方法来做到这一点?提前致谢!
【问题讨论】:
如果你被允许使用 scalaz,那么是的:
val original:Seq[(String,Future[Int])] = Seq("a" -> Future.successful(1))
val transformed:Future[Map[String,Int]] = original.toMap.sequenceU
【讨论】:
或
val s = Seq( ("1", f1), ("2", f2) )
Future.sequence( s.map { case (k ,v) => v.map(fv => (k ,fv)) } ).map(_.toMap)
【讨论】:
您可以使用 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)
}
}
}
【讨论】:
这并不难。您需要三个步骤:
//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 }
【讨论】: