Sonar提示使用Map#computeIfAbsent,如何改写方法保证结果一致?
使用Map#computeIfAbsent改写原方法并保证逻辑一致
原方法代码:
private static void method(Integer key, final Map<Integer, Integer> aMap) { var value = aMap.get(key); if(value == null) { value = 0; } aMap.put(key, value + 1); }
你担心的点没错:单纯调用computeIfAbsent(key, k -> 0)会把0存入Map,但只要调整写法,就能让改写后的逻辑和原方法完全一致,同时满足Sonar的提示要求:
private static void method(Integer key, final Map<Integer, Integer> aMap) { aMap.put(key, aMap.computeIfAbsent(key, k -> 0) + 1); }
逻辑一致性说明
- 原方法逻辑:
- 当key不存在时,直接向Map存入
1(先把value设为0,再计算0+1) - 当key存在时,取出原有值加1后存回
- 当key不存在时,直接向Map存入
- 改写后逻辑:
aMap.computeIfAbsent(key, k -> 0):key不存在时,先向Map存入0并返回0;key存在时直接返回现有值- 紧接着将返回值+1,通过
put存入Map——这一步会覆盖掉之前存入的0(仅针对新增key的场景) - 最终Map中的结果和原方法完全一致:新增key时存1,已有key时存原有值+1
内容的提问来源于stack exchange,提问作者thmasker
相关产品推荐
相关产品推荐

