Scala将Map [Int,Future [Seq [T]]]转换为Future [Map [Int,Seq [T]]]

时间:2014-12-12 18:11:24

标签: scala

如何转换

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))
)

1 个答案:

答案 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内构建一个新集合,使用前面提供的相同函数将未来元组映射到未来元组。