Map增强

Java8 为我们提供了一系列对Map接口的增加,通过lambda表达式的引入,简化了一些Map的常用操作,如:当key不存在时返回默认值,key不存在时才put等。

Map<String,Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
map.put("d", 4);

1、forEach

循环遍历Map键值对

// 遍历时,map的key和value将作为lambda表达式的参数
MAP.forEach((key, val) -> System.out.println("key = " + key + ", value = " + val));

2、getOrDefault

key不存在时返回默认值

map.getOrDefault("test", 100);
//等价于
map.get("test") != null ? map.get("test") : 100;

3、putIfAbsent

key不存在时才put

// 不存在e这个key就把5放进去
map.putIfAbsent("e", 5);
​
// 等价于下面的操作
if (map.get("e") == null) {
    map.put("e", 5);
}

4、computIfAbsent

key不存在或value为null时,计算一个新值,非null则put进去并返回新值,null则什么都不做,返回旧值。key存在则不改变,返回旧值

map.computeIfAbsent("hello", key -> key.length());
​
// 等价于
if (map.get("hello") == null) {
    map.put("hello",  "hello".length());
    return map.get("hello"); //5
} else {
    return map.get("hello"); //原来的值
}

5、computeIfPresent

key存在且value不为null,就计算一个新的值替换老值,返回新值,如果新值为null,则删除该key。key不存在,则什么都不做,返回null。

map.get("a"); //1
// 如果key存在就计算一个新的值替换老值
map.computeIfPresent("a", (oldKey, oldVal) -> oldVal * 2);
​
// 等价于
if (map.get("a") != null) {
    map.put("a", map.get("a") * 2); //2
}

6、merge

如果key不存在,则创建key,赋值。如果key存在,则取出旧值,合并(自定义)旧值、新值赋值

map.get("b"); //2
// 合并key的老值和指定值为一个新值设置进去,put并返回,如果老值不存在就直接把给定值作为新值设置进去,不用进行合并
map.merge("b", 3, (oldVal, givenVal) -> oldVal + givenVal);
map.get("b"); //5