JDK8–Map新增方法
因在看部分源码时,发现用到一些Map的新增方法但是并不知道其具体含义,故了解并整理。
computer
解释
简单点说就是针对key的value重新设值,具体的值取决于自定义函数返回值。
自定义函数返回值不等于空,则会将自定义函数返回的value设置成key对应的值。
如果key对应的value不等于空但是自定义函数返回值等于空则会删除这个key。
V oldValue = map.get(key);
// 通过自定义的BiFunction,对key和oldValue处理后返回新的数据
V newValue = remappingFunction.apply(key, oldValue);
// 如果oldValue不为空
if (oldValue != null ) {
// 并且自定义的的BiFunction返回的newValue不等于空
if (newValue != null)
// 替换直接的oldValue
map.put(key, newValue);
else
// 如果自定义的的BiFunction返回的newValue等于空,则移除该key
map.remove(key);
} else {
// 如果oldValue等于空,newValue不等于空,则存放key,newValue到map中
if (newValue != null)
map.put(key, newValue);
else
// 否则返回null
return null;
}
简单使用
Map<String, String> map = new HashMap<String, String>();
// 计算该key,如果value等于null则设置key=1,value=1,否则将该key对应的value+1存放到对应key
map.compute("1", (k, v) -> {
return v == null ?
String.valueOf(1) : String.valueOf(Integer.valueOf(v) + 1);
});
System.out.println(map.containsKey("1"));//输出true
// 如果自定义函数返回null,则会删除该key
map.compute("1", (k, v) -> {
return null;
});
System.out.println(map.containsKey("1"));//输出false
应用场景
统计一个字符串中字符出现的次数
String str = "hello, i am vary happy! nice to meet you, my name is demo";
// jdk8之前的写法
HashMap<Character, Integer> result1 = new HashMap<>(32);
for (int i = 0; i < str.length(); i++) {
char curChar = str.charAt(i);
Integer curVal = result1.get(curChar);
if (curVal == null) {
curVal = 1;
} else {
curVal += 1;
}
result1.put(curChar, curVal);
}
result1.forEach((k, v) -> {
System.out.println(k + "--" + v);
});
// 清除信息
result1.clear();
// jdk8的写法
for (