Map中的computeIfAbsent()方法

03-29 4354阅读 0评论

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

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

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

Map中的computeIfAbsent()方法 第1张

Map中的computeIfAbsent()方法 第2张

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

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

Map中的computeIfAbsent()方法 第3张

就会出现异常。

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

Map中的computeIfAbsent()方法 第4张

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

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

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

做法如下:

Map中的computeIfAbsent()方法 第5张

解释一下:

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

例子如下:

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 dataMap = new HashMap();
        // 初始化键值对,值为 List 类型
        List 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 numbers2 = dataMap.computeIfAbsent("numbers2", key -> new LinkedList());
        numbers2.add(100);
        // 输出 Map 中的键值对
        System.out.println("Map 中的键值对:");
        for (Map.Entry entry : dataMap.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }
    }
}

Map中的computeIfAbsent()方法 第6张

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

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 dataMap = new HashMap();
        // 初始化键值对,值为 List 类型
        List 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 numbers2 = dataMap.computeIfAbsent("numbers2", key -> new LinkedList());
        numbers2.add(100);
        
        // 使用 computeIfAbsent 方法操作 List
        List numbers3 = dataMap.computeIfAbsent("numbers21234", key -> new LinkedList());
        numbers3.add(100);
        // 输出 Map 中的键值对
        System.out.println("Map 中的键值对:");
        for (Map.Entry entry : dataMap.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }
    }
}

Map中的computeIfAbsent()方法 第7张

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

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

default V computeIfAbsent(K key,Function

免责声明
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明。
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所
提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何
损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在
转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并白负版权等法律责任。

手机扫描二维码访问

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,4354人围观)

还没有评论,来说两句吧...

目录[+]