HashMap中的compute、computeIfAbsent、computeIfPresent

本文详细解析了HashMap中的compute、computeIfAbsent及computeIfPresent方法的工作原理与应用场景,通过具体示例展示了如何利用这些方法高效地更新或获取Map中的元素。
该文章已生成可运行项目,

HashMap中的compute、computeIfAbsent、computeIfPresent

1、compute

在这里插入图片描述

1)查看compute方法的文档:

在这里插入图片描述

根据指定的key和它对应的value,计算一个新的映射(如果没有当前映射,则value为null)。

2)查看BigFunction接口的文档:

在这里插入图片描述

表示一个接受两个参数并产生结果的函数接口。

3)分析

compute方法可以根据指定key值,找到map中对应的键值对,进行一番计算后,返回新value。如果新value不为null,且key值在map中本就存在,则新value替换对应旧value;如果key值在map中原本就不存在,则新的映射建立。如果新value为null,将删除旧的映射。

4)测试

控制台打印结果为11

@Slf4j
public class Main {
    public static void main(String[] args) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        hashMap.put(1, 10);
        hashMap.compute(1, (key, value) -> {
            if (value == null) {
                value = 0;
            }
            return key + value;
        });
        log.info(hashMap.get(1).toString());
    }
}

控制台打印结果为10和4

@Slf4j
public class Main {
    public static void main(String[] args) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        hashMap.put(1, 10);
        hashMap.compute(4, (key, value) -> {
            if (value == null) {
                value = 0;
            }
            return key + value;
        });
        log.info(hashMap.get(1).toString());
        log.info(hashMap.get(4).toString());
    }
}

控制台打印结果为false

@Slf4j
public class Main {
    public static void main(String[] args) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        hashMap.compute(4, (key, value) -> {
            if (value == null) {
                value = 0;
            }
            return null;
        });
        log.info(String.valueOf(hashMap.containsKey(4)));
    }
}

控制台打印结果为false

@Slf4j
public class Main {
    public static void main(String[] args) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        hashMap.put(1, 10);
        hashMap.compute(1, (key, value) -> {
            if (value == null) {
                value = 0;
            }
            return null;
        });
        log.info(String.valueOf(hashMap.containsKey(1)));
    }
}

注意,如果value在lambda函数中参与了计算,那么对value进行判空是很有必要的,因为如果指定的key在map中不存在,那么参与计算的value将是null。

2、computeIfAbsent

在这里插入图片描述
在这里插入图片描述

1)分析

如果指定key不存在或关联值为null,就把函数接口返回的值作为指定key的value(除非返回值为null)

2)测试

控制台打印结果为10

@Slf4j
public class Main {
    public static void main(String[] args) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        hashMap.put(1, 10);
        hashMap.computeIfAbsent(1, k -> 20);
        log.info(hashMap.get(1).toString());
    }
}

控制台打印结果为20

@Slf4j
public class Main {
    public static void main(String[] args) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        hashMap.computeIfAbsent(1,k->20);
        log.info(hashMap.get(1).toString());
    }
}

控制台打印结果为20

@Slf4j
public class Main {
    public static void main(String[] args) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        hashMap.put(1, null);
        hashMap.computeIfAbsent(1,k->20);
        log.info(hashMap.get(1).toString());
    }
}

控制台打印结果为false

@Slf4j
public class Main {
    public static void main(String[] args) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        hashMap.computeIfAbsent(1,k->null);
        log.info(String.valueOf(hashMap.containsKey(1)));
    }
}

3、computeIfPresent

在这里插入图片描述
在这里插入图片描述

1)分析

如果指定key对应的value存在且不是null,就将函数接口的返回值和key建立联系。

2)测试

控制台打印结果为20

@Slf4j
public class Main {
    public static void main(String[] args) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        hashMap.put(1, 10);
        hashMap.computeIfPresent(1,(k,v)->20);
        log.info(hashMap.get(1).toString());
    }
}

控制台打印结果为false

public class Main {
    public static void main(String[] args) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        hashMap.computeIfPresent(1,(k,v)->20);
        log.info(String.valueOf(hashMap.containsKey(1)));
    }
}

控制台打印结果为true

@Slf4j
public class Main {
    public static void main(String[] args) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        hashMap.put(1, null);
        hashMap.computeIfPresent(1,(k,v)->20);
        log.info(String.valueOf(hashMap.get(1) == null));
    }
}
本文章已经生成可运行项目
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值