使用Java Streams API对比两个HashMap并替换属性值求助
修正HashMap对象属性替换的代码问题
我有两个HashMap:
HashMap<DedupeTableEntity,List<DedupeTableEntity>> deltaHashmap HashMap<DedupeTableEntity,List<DedupeTableEntity>> existingHashmap
其中DedupeTableEntity包含id、country、entity_flag属性。
需求如下:
- 遍历deltaHashmap的value列表(两个HashMap均只有一个key,对应一个value列表)
- 检查该对象是否在existingHashmap中,匹配条件为
id和country属性一致 - 若存在,则将existingHashmap中该对象的
entity_flag属性值,替换deltaHashmap中对应对象的entity_flag属性值
原代码存在的问题
- 方法声明为
void类型,却使用了return语句,编译不通过 - 流式操作逻辑混乱,重复全量遍历existingHashmap,且未先判断匹配元素是否存在就执行后续操作
- 获取
entity_flag时错误使用toString(),会得到类似Optional[xxx]的无效字符串 - 缺少流式操作的终端方法,导致逻辑代码不会实际执行
修正后的代码
import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; public void compareTwoHashmaps(HashMap<DedupeTableEntity, List<DedupeTableEntity>> deltaHashmap, HashMap<DedupeTableEntity, List<DedupeTableEntity>> existingHashmap) { // 预构建existing元素的快速匹配映射,避免重复全量遍历 Map<String, DedupeTableEntity> existingEntityMap = existingHashmap.values().stream() .flatMap(Collection::stream) .collect(Collectors.toMap( entity -> entity.getId() + "|" + entity.getObjectCountry(), entity -> entity )); // 遍历delta元素,匹配后替换属性 deltaHashmap.values().stream() .flatMap(Collection::stream) .forEach(deltaEntity -> { String matchKey = deltaEntity.getId() + "|" + deltaEntity.getObjectCountry(); DedupeTableEntity matchedEntity = existingEntityMap.get(matchKey); if (matchedEntity != null) { deltaEntity.setEntityFlag(matchedEntity.getEntityFlag()); } }); }
修正说明
- 先将existingHashmap的元素转换为以
id+分隔符+country为键的映射,后续匹配仅需O(1)时间,大幅提升效率 - 使用
forEach作为流式操作的终端方法,直接执行属性替换逻辑,符合void方法的要求 - 逻辑清晰,先匹配再判断存在性,避免无效操作
- 若
id或country包含分隔符(示例用|),可以自定义一个包含id和country的Key类(重写equals和hashCode)来作为映射键,更规范可靠
内容的提问来源于stack exchange,提问作者Sithija Piyuman Thewa Hettige
相关产品推荐
相关产品推荐

