首页 > 解决方案 > 使用 Java 8 在列表中交换嵌套映射的键

问题描述

我有一个有结构的对象

List<Map<String(k1), Map<String(k2), String(v2)>>>

我需要将上面的列表转换为

List<Map<String(k2), Map<String(k1), String(v2)>>>

我被困在如何使用类似的构造获取嵌套地图

serviceResults.stream().map((k, v) -> ????)

这将允许我交换密钥。是否可以在不使用 Java 8 流的循环的情况下做到这一点?

附加信息 这是使用循环构造的代码

    List<Map<String, Map<String, String>>> serviceResults = new ArrayList<>();
    //Populate the above list

    Map<String, Map<String, String>> swpMapOuter = new HashMap<>();
    Map<String, String> swpMapInner = new HashMap<>();
    for (Map<String, Map<String, String>> stringMapMap : serviceResults) {
        for (Map.Entry<String, Map<String, String>> s : stringMapMap.entrySet()) {
            String key1 = s.getKey();
            Map<String, String> value1 = s.getValue();
            for (Map.Entry<String, String> s1 : value1.entrySet()) {
                String key2 = s1.getKey();
                String value2 = s1.getValue();
                swpMapInner.put(key1, value2);
                swpMapOuter.put(key2, swpMapInner);
            }
        }
    }
    System.out.println("swpMapOuter " + swpMapOuter);

下面是 forEach 的代码,而不是 for 循环,但想知道是否可以使用 Stream 构造来实现

    Map<String, Map<String, String>> swpMapOuter2 = new HashMap<>();
    Map<String, String> swpMapInner2 = new HashMap<>();
    serviceResults.forEach((stringMapMap) -> {
        stringMapMap.entrySet().forEach((s) -> {
            String key1 = s.getKey();
            Map<String, String> value1 = s.getValue();
            value1.entrySet().forEach((s1) -> {
                String key2 = s1.getKey();
                String value2 = s1.getValue();
                swpMapInner2.put(key1, value2);
                swpMapOuter2.put(key2, swpMapInner2);
            });
        });
    });

    System.out.println("swpMapOuter2 " + swpMapOuter2);

标签: javajava-8java-stream

解决方案


推荐阅读