【问题标题】:Scala transform Map[Int, Future[Seq[T]]] to Future[Map[Int, Seq[T]]]Scala 将 Map[Int, Future[Seq[T]]] 转换为 Future[Map[Int, Seq[T]]]
【发布时间】:2014-12-12 18:11:23
【问题描述】:

我怎样才能改变一个

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

【问题讨论】:

标签: scala


【解决方案1】:

应该这样做:

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)],然后能够在Futures 的结果序列上使用Future.sequence。然后折叠的Future 可以映射回Map

这可以使用@IonutG.Stan 建议的Future.traverse 稍微缩短:

Future.traverse(m){ case (i, f) => f.map((i, _))}.map(_.toMap)

这将在 m 中的 Future 中构建一个新集合,使用之前提供的相同函数将具有期货的元组映射到未来的元组。

【讨论】:

  • 你可以通过使用traverse而不是sequence来摆脱m.map调用:Future.traverse(m)({ case (a,b) => b.map(a -> _) }).map(_.toMap)
  • 确实!这样更好一些。
  • 不幸的是,我正在使用 Twitter Futures,Future.traverse 以及 Future.sequence 对我不可用。
  • 这是一个很重要的问题。Future.sequence 在内部实际上只是一个foldLeft
  • @sonix 你应该能够相对轻松地交换 Future.sequence 和 twitter Futures.collect
猜你喜欢
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
相关资源
最近更新 更多