Java8增加了Map的API,方便我们的操作,使用的场景还是比较多的,在这里做下总结。
API介绍
方法名称 | 用途 | 说明 |
---|---|---|
forEach | 遍历Map | 新的遍历Map的形式,以前用entrySet的时候泛型写的很复杂,新的api简单易懂。 |
compute | 根据原来的值,更新值 | 如果返回的值为null,会从集合中删除掉该键值对,而不是把值更新为null |
computeIfAbsent | absent译为缺乏的。方法目的在于声明不包含该键或者键对应的值为null时的处理逻辑,即添加默认值。 | 不包含和值为null都会出发函数处理 |
computeIfPresent | Present译为存在的。方法目的在于声明键对应的值不为null时的处理逻辑,即根据原来的值更新值 | 定义函数的时候不需要对value进行判断空处理。新值为null的时候删除键值对 |
getOrDefault | 当集合中不存在指定Key时,定义默认值 | 获取到的默认值不会存入集合替换旧值。判断条件是key是否存在,不会去判断key对应的值是不是null |
merge | 根据map中指定key的原始值,计算出新值 | 第一个参数:键;第二个参数:当key不存在或者value是null时候为key添加的默认值;函数的第一个是原始值,第二个是默认值,返回map的value。 |
putIfAbsent | 如果key对应的值是null,放入默认值 | 方法返回的是当前key对应的值 |
replace | 替换 | 和put覆盖的区别在于如果不存在key的时候返回null,且不会去放入新值。put不管之前key对应的值存不存在都会放入新键值。 |
完整Demo
public class MapTest {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
map.put("a",1);
map.put("b",3);
System.out.println("-----forEach写法----");
map.forEach((key, value)->System.out.println(key+ " ---> "+ value));
System.out.println("-----compute----");
doCompute(map, "a");
System.out.println(map.get("a"));
// console:3 原值为1,计算出新的值为3
doCompute(map, "c");
System.out.println(map.get("c"));
// console:1 原来不存在的key,现在新建键值对,key:c value:1
doCompute(map, "b");
System.out.println(map.containsKey("b"));
// console:false 当原来有值,但是现在返回null的时候删除该键值对
//ComputeIfAbsent用法 不包含该键或者key对应的值为null,则会根据方法添加新的键值对
map.clear();
System.out.println("-----doComputeIfAbsent----");
System.out.println(doComputeIfAbsent(map, "a"));
// console: 1 ;如果传入的键对应的值为空的时候,执行后面的函数,为该键初始化一个值放入集合
map.put("a",3);
System.out.println(doComputeIfAbsent(map, "a"));
// console: 3 ; 如果传入的键对应的值不为空的时候,返回
map.clear();
System.out.println("-----doComputeIfPresent----");
System.out.println(doComputeIfPresent(map, "a"));
//console: null; value不存时不会执行函数,好处是不用在函数中处理空值
map.put("a",3);
System.out.println(doComputeIfPresent(map, "a"));
//console: 4 ; 如果value值不为空执行函数
map.put("b",1);
doComputeIfPresent(map, "b");
System.out.println(map.containsKey("b"));
//console: false; 如果返回的值是null 会从集合中删除key
map.clear();
System.out.println("-----doGetOrDefault----");
System.out.println(map.getOrDefault("a",3));
//console: 3; 因为不存在key 返回3
System.out.println(map.get("a"));
//console: null; 所以这个方法不会把默认值回填到集合中,不会创建新的键值对
map.put("a",null);
System.out.println(map.getOrDefault("a",3));
//console: null; 不会去校验键对应的value值,只看存不存在key
map.clear();
System.out.println("-----domerge----");
map.put("a",2);
/**
* 第一个参数: 指定键
* 第二个参数: 默认值,当key对应的value为null返回值,该值会存入集合
* 第三个参数: lambda表达式,输入为集合中的原始值以及之前定义的默认值, 返回是map中的value
*/
Integer res = map.merge("a", 1, (oriValue, value)->{
System.out.println("原值:"+ oriValue);
System.out.println("默认值:" + value);
return oriValue+4;
});
System.out.println(res);
//console: 6; 原始值为2 加了4 返回6;
System.out.println(map.get("a"));
//console: 6; 集合中对应的key的值已经更新
System.out.println("----验证默认值-----");
Integer res2 = map.merge("c", 1, (oriValue, value)->{
System.out.println("原值:"+ oriValue);
System.out.println("默认值:" + value);
return oriValue+4;
});
System.out.println(res2);
//console: 1; 不存在key或者key的value是null的时候 返回默认值
System.out.println(map.get("c"));
//console: 1; 不存在key或者key的value是null的时候 返回默认值已存入集合
map.clear();
System.out.println("----putIfAbsent----");
//如果key对应的值是null,放入默认值
System.out.println(map.putIfAbsent("a",1));
//console: null; 这里返回的是原来map中key对应的值
System.out.println(map.get("a"));
//console: 1; 已经将默认值放入集合
map.put("a",3);
System.out.println(map.putIfAbsent("a",1));
//console: 3; 返回的是当前的键对应的值
map.clear();
System.out.println("----replace----");
//和put覆盖的区别在于如果不存在key的时候返回null,且不会去放入新值。put不管之前key对应的值存不存在都会放入新键值。
System.out.println(map.replace("a",1));
//console:null; key不存在时不处理;
map.put("a",null);
map.replace("a",1);
System.out.println(map.containsKey("a"));
//console: true; 当key存在是替换,不会去判断value是不是null;
map.clear();
map.put("a",3);
System.out.println(map.replace("a",1));
//console:3 ; replace返回的是替换前的值
System.out.println(map.get("a"));
//console: 1; 集合中的值已经替换成指定值了
}
/**
* compute 用来根据原来的值计算新的值,计算出来的值不需要重新put进去,当做function的结果返回即可
* 如果传入的key为空要处理,不然会报空指针
* 如果输入key对应的值为null,创建键值对key, 1
* 如果输入的key的值是3返回null; 注意:原键值不为null,返回值为null,是不会改变原来值的。
* 否则给值加2重新返回集合中
* @param map
*/
public static void doCompute(Map<String,Integer> map, String key){
map.compute(key, (k,v)->{
if(null == v){
return 1;
}
else if(v == 3){
return null;
}
else{
return v+2;
}
});
}
public static Integer doComputeIfAbsent(Map<String,Integer> map, String key){
return map.computeIfAbsent(key, k->1);
}
//如果获取到的key对应的值不为null, 则根据原来的key和value计算出新的值,覆盖原来的值,新值为null的时候删除键值对
public static Integer doComputeIfPresent(Map<String,Integer> map, String key){
return map.computeIfPresent(key,(k,value)->{
if("b".equals(k)){
return null;
}
else{
return value+1;
}
});
}
}