gpt4 book ai didi

scala - 如何将 Map[A,Future[B]] 转换为 Future[Map[A,B]]?

转载 作者:行者123 更新时间:2023-12-03 09:18:38 24 4
gpt4 key购买 nike

我一直在使用 Scala Akka 库,但遇到了一些问题。正如标题所说,我需要转换 Map[A, Future[B]]Future[Map[A,B]] .我知道可以用 Future.sequence对于像列表这样的可迭代对象,但在这种情况下不起作用。

我想知道:Scala 中是否有一种干净的方法来进行这种转换?

最佳答案

看看这是否适合你:

val map = Map("a" -> future{1}, "b" -> future{2}, "c" -> future{3})    
val fut = Future.sequence(map.map(entry => entry._2.map(i => (entry._1, i)))).map(_.toMap)

这个想法是将 map 映射到 Iterable对于 Tuple映射的键和与该键相关联的 future 结果。从那里你可以 sequence那个 Iterable然后一旦你有了聚合 Future ,映射它并转换它 IterableTuples通过 toMap 到 map .

现在,这种方法的替代方法是尝试做一些类似于 sequence 的事情。功能正在做,有一些调整。你可以写一个 sequenceMap功能如下:
def sequenceMap[A, B](in: Map[B, Future[A]])(implicit executor: ExecutionContext): Future[Map[B, A]] = {
val mb = new MapBuilder[B,A, Map[B,A]](Map())
in.foldLeft(Promise.successful(mb).future) {
(fr, fa) => for (r <- fr; a <- fa._2.asInstanceOf[Future[A]]) yield (r += ((fa._1, a)))
} map (_.result)
}

然后在这样的例子中使用它:
val map = Map("a" -> future{1}, "b" -> future{2}, "c" -> future{3})    
val fut = sequenceMap(map)
fut onComplete{
case Success(m) => println(m)
case Failure(ex) => ex.printStackTrace()
}

这可能比第一个示例更有效,因为它创建的中间集合更少,并且对 ExecutionContext 的命中更少。 .

关于scala - 如何将 Map[A,Future[B]] 转换为 Future[Map[A,B]]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17479160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com