java - 如何对 n 个散列图使用 java 8 合并函数

标签 java string java-8 java-stream

我需要在一个循环中理想地合并 n 个散列图,如下所示,使用 java 8 merge 或其他东西:

map 1:{Name:XXX,Phn:123,Work:""}

map 2 : {Name:XXX,Phn:456,Work: xyz}

map 3:{Name:XXX,Phn:789,Work:""}

我想得到如下输出:

{
   Name:XXX,        // if all values for a key are same take one
   Phn:123/456/789  // merge all non null values for same key
   Work:xyz         // make sure non-null values are never replaced
}

当我尝试像这样使用 putall 时

public Map<String,String> mergeOriginalDataMaps(List<Integer> indexList, List<Map<String,String>> originalData) {   
    Map<String,String> tmpMap = new HashMap<String,String> ();
    for (int index : indexList ) {
        tmpMap.putAll(originalData.get(index));
    }
    return tmpMap;
}

如果duplicate key的值为"",则之前的值被替换为新的值。我需要连接值而不是替换它们。

最佳答案

如果您有一个 List<Map<String, String>> ,它表示要合并的 map 列表,您可以拥有

Map<String, String> result =
    maps.stream()
        .flatMap(m -> m.entrySet().stream())
        .collect(Collectors.groupingBy(
            Map.Entry::getKey,
            Collectors.mapping(
                Map.Entry::getValue,
                Collectors.collectingAndThen(Collectors.<String>toSet(), s -> String.join("", s))
            )
        ));

此平面将每个映射映射到其条目的 Stream 中。然后 Stream 按每个条目的值分组,所有具有相同键的不同元素都映射到它们的值,并连接起来。

通过首先收集 Set 中的所有值,可以实现不同的部分。


示例代码:

public static void main(String[] args) {
    List<Map<String, String>> maps = new ArrayList<>();
    maps.add(new HashMap<String, String>(){{ put("Name", "XXX"); put("Phn", "123"); put("Work", ""); }});
    maps.add(new HashMap<String, String>(){{ put("Name", "XXX"); put("Phn", "456"); put("Work", "xyz"); }});
    maps.add(new HashMap<String, String>(){{ put("Name", "XXX"); put("Phn", "789"); put("Work", ""); }});

    Map<String, String> result =
        maps.stream()
            .flatMap(m -> m.entrySet().stream())
            .collect(Collectors.groupingBy(
                Map.Entry::getKey,
                Collectors.mapping(
                    Map.Entry::getValue,
                    Collectors.collectingAndThen(Collectors.<String>toSet(), s -> String.join("", s))
                )
            ));

    System.out.println(result); // prints "{Phn=123456789, Work=xyz, Name=XXX}"
}

关于java - 如何对 n 个散列图使用 java 8 合并函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36240667/

相关文章:

javascript - 尝试将提交按钮的状态从禁用更改为启用

java - Spring中使用密码编码时用户登录失败

string - 使用 Powershell,如何在多行变量中找到特定行,然后找到该行中的第三个单词或值

javascript - 如何在javascript中用空格替换字符串中的所有\?

java - 如何在 java 流中映射超过 1-1 条记录?

java - 无法将我的头缠绕在填充一元树上

java - libgdx Screen - 如何通过字符串设置新屏幕

java-8 - Comparator.comparing() 函数如何工作?

java.util.Set 未通过 ParameterizedType 检查

java - 我的 Quartz cron 表达式有什么问题? 6 :30 Am, 上午 9 点、中午 12 点、下午 2 点