我必须在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)))
答案 0 :(得分:0)
您可以使用flatmap
和map
的组合:
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
方法的文档。