如何用Java Stream API将嵌套Map转换为单层Map?
使用Stream API转换嵌套Map为单层Map
当然可以用Stream API实现这个转换,而且能和你原来的forEach + putAll行为完全一致(即内层Map存在重复键时,后处理的键值对会覆盖先处理的)。
实现代码(Java 8+)
Map<String, String> result = myMap.values() .stream() .flatMap(innerMap -> innerMap.entrySet().stream()) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (oldVal, newVal) -> newVal // 重复键时保留后出现的值,和putAll逻辑对齐 ));
代码说明
myMap.values().stream():先获取外层Map中所有内层Map的流flatMap(...):把每个内层Map的键值对(Entry)展开成一个连续的Entry流Collectors.toMap(...):将Entry流收集为单层Map,第三个参数是冲突解决策略,这里指定用新值覆盖旧值,和你原来的putAll逻辑完全匹配——因为putAll会按外层Map的遍历顺序,后面的内层Map的键会覆盖前面的。
Java 9+ 更简洁的写法
如果用Java 9及以上,可以用Collectors.flatMapping直接在收集阶段展开流,代码更紧凑:
Map<String, String> result = myMap.values() .stream() .collect(Collectors.flatMapping( innerMap -> innerMap.entrySet().stream(), Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (oldVal, newVal) -> newVal ) ));
注意事项
如果能确保所有内层Map的键都不重复,可以省略toMap的第三个参数,但建议保留——一旦出现重复键,没有冲突策略会直接抛出IllegalStateException,不如提前指定符合业务逻辑的处理方式。
内容的提问来源于stack exchange,提问作者Marko
相关产品推荐
相关产品推荐

