lambda - 合并两个 Map<String, Set<String>> 类型的 Map

标签 lambda merge java-8 set java-stream

我有两张 Map<String, Set<String>> 类型的 map 我需要根据每个的键进行合并。我正在使用 Java 8。

我尝试过以下方法:

Map<String, Set<String>> collect = Stream.of(keyColumnValueAccumulator, keyColumnValues)
                .map(Map::entrySet)
                .flatMap(Collection::stream)
                .collect(Collectors.toMap(
                        Map.Entry::getKey, 
                        Map.Entry::getValue));

但在运行时这会导致“重复 key ”错误。请问有人可以帮忙吗?我对 Java 8 和 Stream API 还很陌生

最佳答案

您还可以使用Map::merge避免重复键错误的方法。

示例:

Map<String, Set<String>> accumulator = new HashMap<>();
firstMap.forEach((k, v) -> accumulator.merge(k, v, (prev, cur) -> {prev.addAll(cur); return prev;}));
secondMap.forEach((k, v) -> accumulator.merge(k, v, (prev, cur) -> {prev.addAll(cur); return prev;}));

在发生按键冲突的情况下,我们只需将两个集合累积为一个集合,但如果这不是所需的行为,您可以随时更改它或为 remappingFunction 创建自定义函数。

关于lambda - 合并两个 Map<String, Set<String>> 类型的 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50863548/

相关文章:

c# - 错误 : Only primitive types or enumeration types are supported in this context EF

git - 如何使用给定策略从命令行仅针对一个文件解决 git merge 冲突?

java - 可选的 throw 需要 NPE 的 throws 声明

java - java.time.LocalDateTime 类型的属性在 Hibernate 中不能用作 JPA 查询参数

mysql - Java 8 java.time 未正确映射到 mysql

c# - 如何使用 linq 从 1 行数据构建对象?

java - 通过条件查找ArrayList中的元素并通过lambda返回他或null

c++ - 是否可以提取 lambda 的捕获列表?

excel - 有合并单元格时使用find方法,vba excel

git - Intellij 作为 merge 工具无法正确检测编码