Scala:地图的未来清单
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala:地图的未来清单相关的知识,希望对你有一定的参考价值。
我有一个包含未来地图的列表
val m1 = Future(Map(("A" -> 1), ("B" -> 1)))
val m2 = Future(Map(("A" -> 1), ("C" -> 1)))
val m3 = Future(Map(("C" -> 5), ("D" -> 1)))
val list = List(m1, m2, m3)
我想合并所有地图并汇总键的值。我想要的输出如下
Future(Map(A -> 2, B -> 1, C -> 6, D -> 1)
如何执行相同的操作。
答案
您可以使用Future.sequence
方法执行从List[Future[Map[_, _]]]
到Future[List[Map[_, _]]]
的转换,然后使用列表上的reduce函数合并映射并将自定义合并函数传递给它。
示例:
val list = List(m1, m2, m3)
def merge(first: Map[String, Int], second: Map[String, Int]): Map[String, Int] =
first ++ second.map case (k, v) => (k, v + first.getOrElse(k, 0))
Future.sequence(list).map(_.reduce(merge _)) // will produce Future(Map(A -> 2, B -> 1, C -> 6, D -> 1))
另一答案
我会做这样的事情:
val m1 = Future(Map(("A" -> 1), ("B" -> 1)))
val m2 = Future(Map(("A" -> 1), ("C" -> 1)))
val m3 = Future(Map(("C" -> 5), ("D" -> 1)))
val futures = List(m1, m2, m3)
val future = Future.sequence(futures) // Converts List of Future to Future of List
val futureMap = Future.sequence(futures).map(_.flatMap(_.toList).toMap)
基本上,它将Seq[Map[String, Int]]
转换为第一个Seq[(String, Int)]
,然后最终将其转换为Map:Map[String, Int]
。
以上是关于Scala:地图的未来清单的主要内容,如果未能解决你的问题,请参考以下文章