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

son*_*nix 3 scala

我怎样才能改变一个

Map[Int, Future[Seq[T]]]
Run Code Online (Sandbox Code Playgroud)

Future[Map[Int, Seq[T]]]
Run Code Online (Sandbox Code Playgroud)

在Scala没有等待未来.

例:

Map( 
  1 -> Future.successful(Seq(100, 200, 300)),
  2 -> Future.successful(Seq(500, 600, 700))
)
Run Code Online (Sandbox Code Playgroud)

Mic*_*jac 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)
Run Code Online (Sandbox Code Playgroud)

从内到外,我将键值映射(Int, Future[T])Future[(Int, T)],然后能够使用s Future.sequence的结果序列Future.然后折叠Future可以映射回一个Map.

Future.traverse根据@ IonutG.Stan的建议,可以稍微缩短一下:

Future.traverse(m){ case (i, f) => f.map((i, _))}.map(_.toMap)
Run Code Online (Sandbox Code Playgroud)

这将在Futurefrom中构建一个新集合m,使用前面提供的相同函数将元组与未来映射到未来元组.

  • 您可以使用`traverse`而不是`sequence`来删除`m.map`调用:`Future.traverse(m)({case(a,b)=> b.map(a - > _)} ).MAP(_.toMap)` (3认同)