如何通过将其值转换为键来展平 Map

How to flatten a Map by turning its values into keys

如何根据分组为键的值将 Map<String, List<String>> 转换为扁平化地图。

即从 Map<String, List<String>>Map<String, String>(按值压平)

举个例子。

来源图:

<"fuel", ["BMW", "Honda"]>,
<"electric", ["Tesla", "Nio"]>

扁平化地图:

[  
"BMW" : "fuel",  
"Honda" : "fuel",  
"Tesla" : "electric",  
"Nio" : "electric"
]

根据 equals/hashCode 在同一地图中不可能有 多个键 相同,因为它与 map[= 的想法相矛盾67=] 数据结构。每个键都必须是唯一的,您不能在 Map.

中使用 相同的键 存储多个条目

但是您可以创建一个包含 Map.Entry 个对象的 列表

为此,您需要在 条目集 上创建一个流,然后通过创建一个 flatten 每个条目]新条目基于汽车品牌(扁平值的元素)每个key:

        Map<String, List<String>> cars =
                Map.of("fuel", List.of("BMW", "Honda"),
                        "electric", List.of("Tesla", "Nio"));

        List<Map.Entry<String, String>> entries =
                cars.entrySet().stream()
                    .flatMap(entry -> entry.getValue().stream()
                                .map(brand -> Map.entry(entry.getKey(), brand)))
                    .collect(Collectors.toList());

        System.out.println(entries);

输出

[electric=Tesla, electric=Nio, fuel=BMW, fuel=Honda]

或者您的意图可能是创建一个 Map<String, String>,允许根据 品牌 检索 汽车类型(例如那: "BMW" : "fuel", "Honda" : "fuel") 那么它就有意义了。

总体方法与上一个类似:

  • 条目集上创建流
  • 通过将 value-list 中的一个元素变成 新条目 使用 flatMap() 展平 每个条目;
  • 使用 Collectors.toMap().
  • 将元素收集到 map

但是有一个 警告:所有值都必须是唯一的,或者必须有关于如何 combine/discarde 的规则车型。

我会假设地图中的所有品牌都是唯一的,否则,下面的代码将失败(处理碰撞 Collectors.toMap() 需要第三个参数 - mergeFunction).

        Map<String, String> typeByBrand =
                cars.entrySet().stream()
                        .flatMap(entry -> entry.getValue().stream()
                                .map(brand -> Map.entry(brand, entry.getKey())))
                        .collect(Collectors.toMap(Map.Entry::getKey,
                                                  Map.Entry::getValue));

        System.out.println(typeByBrand);

输出

{Nio=electric, Tesla=electric, BMW=fuel, Honda=fuel}