合并 2 个映射,键作为第二个映射的值

Merge 2 maps with keys as values of second map

我有 2 个地图定义为 Map<String, Set<String>> :

map1 : {
   Honda=[Accord, Civic, CRV], 
   Toyota=[Corola, RAV4, Yaris]
}
map2 : {
   Accord=[5w30, 10w40],
   Civic=[0w30, 5w30, 5w40],
   CRV=[5w30, 5w40, 10w40],
   Corola=[0w30, 10w40], 
   RAV4=[0w20, 0w30, 5w30]
}

我需要合并这 2 个地图,这样结果地图键将是品牌名称(例如本田、丰田),值将是所有机油。有些像这样:

mergeMap: {
   Honda=[0w30, 5w30, 5w40, 10w40],
   Toyota=[0w20, 0w30, 5w30, 10w40]
}

我写了 sam old school 方法,它使用 forEach 块,但我认为使用流等会更好。可能吗?如果是,如何?

由于生成的地图将具有相同的键,您可以使用 mapValues

在 lambda 中,flatMap 值中的每个字符串设置为第二个映射中的相应值(如果存在)。

map1.mapValues { (_, v) -> v.flatMap { map2[it] ?: emptyList() }.toSortedSet() }

这给了你 Map<String, SortedSet<String>>.

请注意,这将按字典顺序对“0w30”字符串进行排序,因为它们是字符串,因此您不会得到您想要的确切顺序。我不知道这些字符串代表什么,但您可能应该用实现 Comparable 的数据 class 来表示它们。那会给你正确的顺序。