如何在嵌套HashMap中使用compute方法改写现有代码?
使用HashMap的compute方法优化嵌套Map操作
我有一个嵌套集合 Map<SomeKey, Map<String, Long>> days,还有一个Long类型字段numberOfDays。想改用HashMap的compute方法改写下面这段代码:
Map<String, Long> match2 = new HashMap<>(); if (days.containsKey(matchingKey)) { match2 = days.get(matchingKey); if (match2.containsKey(mappingNumber)) { Long count = match2.get(mappingNumber); match2.put(mappingNumber, count + numberOfDays); } else { match2.put(mappingNumber, numberOfDays); } } else { match2.put(mappingNumber, numberOfDays); } days.put(matchingKey, match2);
我自己写了一段代码,但不确定是否可行,寻求帮助:
days.compute(matchingKey, (SomeKey, ValueMap) -> { ValueMap.compute(mappingNumber, (key, value) -> (value == null)? numberOfDays : value + numberOfDays ); return VMValueMap; });
你的思路方向是对的,但代码里有几个小问题需要修正,同时可以进一步优化逻辑:
- 参数名错误:lambda里的参数
SomeKey是冗余命名,且最后返回的VMValueMap是笔误,应该和前面的变量名ValueMap保持一致。 - 空指针风险:当
days中没有matchingKey对应的内部Map时,ValueMap会是null,直接调用ValueMap.compute会抛出空指针异常,必须先做初始化处理。
修正后的代码(基础版)
days.compute(matchingKey, (key, valueMap) -> { // 若内部Map不存在,先初始化一个新的HashMap if (valueMap == null) { valueMap = new HashMap<>(); } // 更新内部Map的计数:不存在则设为numberOfDays,存在则累加 valueMap.compute(mappingNumber, (k, count) -> count == null ? numberOfDays : count + numberOfDays); return valueMap; });
更简洁的优化版
可以结合computeIfAbsent和compute,让逻辑更清晰,代码更紧凑:
// 先确保外层Map存在对应的内部Map,不存在则自动创建 days.computeIfAbsent(matchingKey, k -> new HashMap<>()) // 直接对内部Map的指定key执行计数更新 .compute(mappingNumber, (k, count) -> count == null ? numberOfDays : count + numberOfDays);
这段代码完全等价于你原代码的逻辑:
computeIfAbsent会在days中没有matchingKey时,创建并插入新的HashMap,返回该内部Map;若已存在则直接返回现有Map。- 后续的
compute方法处理计数逻辑:如果mappingNumber不存在,就设置为numberOfDays;如果存在,就累加numberOfDays。
内容的提问来源于stack exchange,提问作者parad0x
相关产品推荐
相关产品推荐

