如何转换
Map[Int, Future[Seq[T]]]
到
Future[Map[Int, Seq[T]]]
在Scala没有等待未来。
示例:
Map(
1 -> Future.successful(Seq(100, 200, 300)),
2 -> Future.successful(Seq(500, 600, 700))
)
答案 0 :(得分:7)
应该这样做:
val m = Map(
1 -> Future.successful(Seq(100, 200, 300)),
2 -> Future.successful(Seq(500, 600, 700))
)
Future.sequence { m.map { case (i, f) => f.map((i, _))} }.map(_.toMap)
从内到外,我将键值从(Int, Future[T])
映射到Future[(Int, T)]
,然后能够在Future.sequence
s的结果序列上使用Future
。然后,已折叠的Future
可以映射回Map
。
根据@ IonutG.Stan的建议,可以使用Future.traverse
稍微缩短一下:
Future.traverse(m){ case (i, f) => f.map((i, _))}.map(_.toMap)
这将在Future
m
内构建一个新集合,使用前面提供的相同函数将未来元组映射到未来元组。