今天提交代码使用SonarLint检查时发现
Map.get and value test should be replaced with single method call应该使用单个方法代替map.get
StatisMaxPower statisMaxPower = map.get(id);
if(statisMaxPower == null){
statisMaxPower = new StatisMaxPower();
statisMaxPower.setId(id);
statisMaxPower.setName(name);
map.put(id,statisMaxPower );
}
在JAVA8的Map接口中,增加了一个computeIfAbsent:
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
Function是一个函数式接口
R apply(T t);
此方法首先判断缓存map中是否存在指定的key值,如果不存在,会自动调用mappingFunction(key)计算key的value,然后将key = value放入到缓存map
实例代码:
Map<String, String> map = new HashMap<>();
// java8之前,从map中根据key获取value操作可能会下面的操作
String key = map.get("key");
if (key == null) {
key = "hh";
map.put("key", key);
} else {
// 如果key对应的value值存在,进行相应的操作
}
// java8之后,上面的操作可以简化为一行,若key的value值为空,会将第二个参数的返回值存入并返回
String val = map.computeIfAbsent("key1", k -> "test");
System.out.println(map);
// 打印:{key1=test, key=hh}
把代码改成如下方法:
StatisMaxPower statisMaxPower = map.computeIfAbsent(id,k ->{
StatisMaxPower newStatisMaxPower = new StatisMaxPower();
newStatisMaxPower.setId(id);
newStatisMaxPower.setName(name);
map.put(id,newStatisMaxPower);
return newStatisMaxPower;
});