基于Java Stream实现两个HashMap对比并补全缺失值的最优方案
问题:用Java Stream精简实现HashMap的列表值合并
现有两个Map<String, List<String>>:masterMap为主Map,compareMap为目标Map,需要按键对比,将compareMap中masterMap缺失的列表值补充进去。当前实现存在代码冗余、未处理空值的问题,原代码如下:
Map<String, List<String>> masterMap = new HashMap<>(); Map<String, List<String>> compareMap = new HashMap<>(); compareMap.keySet().stream().forEach(key -> { compareMap.get(key).forEach(v -> { if(!masterMap.get(key).contains(v)){ masterMap.get(key).add(v); } }); });
请问有没有更优的实现,能通过一行代码完成逻辑?
感谢@John Bollinger的建议,基于entrySet的流式处理可以优化第一步,不过还能进一步精简并处理空值问题。以下是更简洁且健壮的实现:
精简实现(支持空值处理)
compareMap.forEach((key, compareList) -> compareList.stream() .filter(val -> !masterMap.computeIfAbsent(key, ArrayList::new).contains(val)) .forEach(val -> masterMap.get(key).add(val)) );
进一步压缩为一行代码
compareMap.forEach((k, v) -> v.stream().filter(val -> !masterMap.computeIfAbsent(k, ArrayList::new).contains(val)).forEach(masterMap.get(k)::add));
实现优势
- 用
Map.forEach替代entrySet().stream().forEach,代码更简洁高效 - 通过
computeIfAbsent自动处理masterMap中不存在的key,创建空列表避免空指针异常 - 借助Stream的
filter直接过滤已存在的值,省去显式的if判断,逻辑更紧凑 - 避免了原代码中重复调用
get(key)的冗余操作
内容的提问来源于stack exchange,提问作者Dreamer
相关产品推荐
相关产品推荐

