Java使用Map.computeIfAbsent()方法简化初始不存在的key

时间:2022-06-01 21:43:15

我们在开发过程中,经常会遇到值为Map的Map。这种情况下我们需要先把key的值取出来,然后判断是否为null。如果值为null,则初始化值并把它存放进Map。

示例代码:

String childKey="2020-01";
User user = new User();
Map<String,Map<String,User>> parentMap = new HashMap();
Map<String, User> childMap = parentMap.get(id);
if(childMap!=null){
    childMap.put(childKey, user);      //<---重复代码
}else{
    childMap = new HashMap<>();
    childMap.put(childKey, user);      //<---重复代码
    parentMap.put(id, childMap);
}

使用Map.computeIfAbsent()简化:

parentMap.computeIfAbsent(id, key -> new HashMap<>()).put(childKey, user);

Map.computeIfAbsent()会计算id是否存在,如果不存在,会调用key->new HashMap<>(),构建key对应的HashMap,并返回新的值。如果id存在则直接返回id对应的HashMap。接着就可以往HashMap里存放数据。

Map相关用于计算key的值默认方法

key存在计算key的值,key不存在,remappingFunction接收到的是null的值,可以在remappingFunction对null处理

default V compute(K key,
            BiFunction<? super K, ? super V, ? extends V> remappingFunction)

key存在直接返回key对应的值,如果key不存在,使用mappingFunction做计算处理

default V computeIfAbsent(K key,
            Function<? super K, ? extends V> mappingFunction)

key存在,使用remappingFunction计算处理,key不存在直接返回null的值。

default V computeIfPresent(K key,
            BiFunction<? super K, ? super V, ? extends V> remappingFunction)