Map中的computeIfAbsent()方法

调用java集合Map.computeIfAbsent()方法

java版本JDK1.8中,Map是我们经常使用的,在面对复杂Map时,我们怎么更好的去维护呢?

比如,这里的复杂Map,即<K,V>中V是一个Collection集合:

我们先拿到Key值对应的Collection,再往Collection中加入元素。但是这会出现一个问题!!!

如果get(key)的结果为null,那么代码就变成这样了:

就会出现异常。

所以,为了不抛出异常,你的代码需要能够处理key不在map里的情况。比如,你可能会这样处理:

也就是当key不在map中时,提前new 一个 Collection放进去。

虽然这样的做法可以解决抛异常的情况,但是代码却变复杂了,那么我们要怎么简化这段代码呢??

答:我们的 map.computeIfAbsent();方法就派上用场了。

做法如下:

解释一下:

computeIfAbsent()方法的效果是:如果key不在Map中,那么会new一个ArrayList作为键值对的值,把这个不存在的key作为键值对的键,然后放到map里面去,并且返回键值对的值。如果key存在,那么就返回这个键对应的值,相当于是get方法。

例子如下:

java 复制代码
package com.yicheng.test.md5Test;

import java.util.*;

/**
 * @Author yimeng
 * @Date 2024/3/22 22:13
 * @PackageName:com.yicheng.test.md5Test
 * @ClassName: Test
 * @Description: TODO
 * @Version 1.0
 */
public class Test {
    public static void main(String[] args) {
        Map<String, List<Integer>> dataMap = new HashMap<>();

        // 初始化键值对,值为 List 类型
        List<Integer> list1 = new ArrayList<>();
        list1.add(10);
        list1.add(20);

        dataMap.put("numbers1", list1);

        // 使用 computeIfAbsent 方法操作 List。当dataMap中的numbers1键存在,那么就相当于是dataMap.get("numbers1").add(30)
        dataMap.computeIfAbsent("numbers1", key -> new ArrayList<>())
                .add(30);

        dataMap.put("numbers2", null);
        // 使用 computeIfAbsent 方法操作 List。
        List<Integer> numbers2 = dataMap.computeIfAbsent("numbers2", key -> new LinkedList<>());
        numbers2.add(100);

        // 输出 Map 中的键值对
        System.out.println("Map 中的键值对:");
        for (Map.Entry<String, List<Integer>> entry : dataMap.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }
    }
}

get(键)的值不存在于Map、get(键)的值为null,效果都是一样的。

java 复制代码
package com.yicheng.test.md5Test;

import java.util.*;

/**
 * @Author yimeng
 * @Date 2024/3/22 22:13
 * @PackageName:com.yicheng.test.md5Test
 * @ClassName: Test
 * @Description: TODO
 * @Version 1.0
 */
public class Test {
    public static void main(String[] args) {
        Map<String, List<Integer>> dataMap = new HashMap<>();

        // 初始化键值对,值为 List 类型
        List<Integer> list1 = new ArrayList<>();
        list1.add(10);
        list1.add(20);

        dataMap.put("numbers1", list1);

        // 使用 computeIfAbsent 方法操作 List
        dataMap.computeIfAbsent("numbers1", key -> new ArrayList<>())
                .add(30);

        dataMap.put("numbers2", null);
        // 使用 computeIfAbsent 方法操作 List
        List<Integer> numbers2 = dataMap.computeIfAbsent("numbers2", key -> new LinkedList<>());
        numbers2.add(100);
        
        // 使用 computeIfAbsent 方法操作 List
        List<Integer> numbers3 = dataMap.computeIfAbsent("numbers21234", key -> new LinkedList<>());
        numbers3.add(100);

        // 输出 Map 中的键值对
        System.out.println("Map 中的键值对:");
        for (Map.Entry<String, List<Integer>> entry : dataMap.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }
    }
}

computeIfAbsent方法是顶级接口Map中的方法。所以只要是实现了Map接口的实现类,都可以使用这个方法。HashMap也能用。

computeIfAbsent方法的声明如下(他是Map中的默认方法,所以所有的Map实现类都会有这个方法,且效果都一样):

java 复制代码
default V computeIfAbsent(K key,Function<? super K, ? extends V> mappingFunction) {
        Objects.requireNonNull(mappingFunction);
        V v;
        if ((v = get(key)) == null) {
            V newValue;
            if ((newValue = mappingFunction.apply(key)) != null) {
                put(key, newValue);
                return newValue;
            }
        }
        return v;
}
相关推荐
今天背单词了吗98016 分钟前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题
天天摸鱼的java工程师19 分钟前
使用 Spring Boot 整合高德地图实现路线规划功能
java·后端
东阳马生架构34 分钟前
订单初版—2.生单链路中的技术问题说明文档
java
咖啡啡不加糖1 小时前
暴力破解漏洞与命令执行漏洞
java·后端·web安全
风象南1 小时前
SpringBoot敏感配置项加密与解密实战
java·spring boot·后端
DKPT1 小时前
Java享元模式实现方式与应用场景分析
java·笔记·学习·设计模式·享元模式
Percep_gan1 小时前
idea的使用小技巧,个人向
java·ide·intellij-idea
缘来是庄1 小时前
设计模式之迭代器模式
java·设计模式·迭代器模式
Liudef061 小时前
基于HTML与Java的简易在线会议系统实现
java·前端·html
JosieBook1 小时前
【Java编程动手学】Java常用工具类
java·python·mysql