Scala - 如何将地图中的所有对象提取到新地图?

时间:2018-03-18 22:35:32

标签: scala

我必须在scala中关注地图

mutable.Map[String, mutable.Map[String, App]]()

假设App包含一个名为Token的字段,该字段不是内部映射的键。

从此嵌套地图中提取地图的最佳做法是什么?

我做了

val result =  mutable.Map[String, AppKey]()
myMap foreach(x=>x._2 foreach(y=>result.put(y._2.token, y._2)))

3 个答案:

答案 0 :(得分:0)

您可以使用flatmapmap的组合:

val result = myMap.flatMap { case (_, mp) => mp.map { case (_, app) => app.token -> app }}

答案 1 :(得分:0)

如果我理解正确,生成的地图的键应该是标记,值应该是AppKey s,你扔掉原始地图的键。

如其他答案中所述,map(或实际flatMap)将是更常见的选择:

val result = myMap.flatMap{ case (_, v) => v.map{ case (_, ak) => ak.token -> ak }}
  .toMap

内部map从其中一个内部地图中提取键值对,flatMap有效地连接这些对的列表。

答案 2 :(得分:0)

此解决方案与其他解决方案相同,但使用for-comprehension,它是嵌套map s,flatMap s(和withFilter s)链的语法糖。 :

for {
  (_, innerMap) <- myMap
  (_, app) <- innerMap
} yield (app.token, app)

您可以在Scala Tour中了解更多相关信息。

Map[String, App]类型的结果,假设为app.token: String。你有AppKey,这可能是一个错字(或者你有不同的意图)。

如@ leo-c所述,您应该考虑到Map中具有相同密钥的两对之间的胜利,所以如果这些代币不是唯一的,那么您只需要失去一些信息。如果是这种情况,您可能希望结果具有类型Map[String, List[AppKey]],以使用相同的令牌对所有应用进行分组。您可以使用以下代码获取它:

val apps = myMap.values.flatMap(_.values)
val result = apps.groupBy(_.token)

请参阅groupBy方法的文档。