JAVA Map类compute方法详解及样例

本文详细介绍了Java中Map类提供的compute方法的用法及其内部实现原理。解释了如何使用此方法来更新Map中的值,包括当指定的key存在或不存在时的不同行为。同时给出了具体的示例代码帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JAVA Map类提供了compute方法,定义是: default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)

用于计算指定key的值,如果Map中不存在指定的key,则计算时值为null, 并将计算的结果作为key的值,但需要注意3点:

  1. 如果remappingFunction函数的结果是null, 如果Map存在此key且值不为null,则删除此key, 否则不做改变

  2. 如果remappingFunction函数抛出了异常,则compute把异常抛出,Map不做改变

  3. 默认实现不保证同步或该方法的原子性。任何实现提供原子性保证必须重写这个方法并记录它并发性能,如ConcurrentMap类的实现

compute方法接受两个参数

  • key:关联value的key

  • remappingFunction: 函数计算值

Returns:返回更新后的该key映射的value值,若key没有映射的value值,则返回null

1. 源码实现:

    default V compute(K key,
            BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
        Objects.requireNonNull(remappingFunction);
        V oldValue = get(key);

        V newValue = remappingFunction.apply(key, oldValue);
        if (newValue == null) {
            // delete mapping
            if (oldValue != null || containsKey(key)) {
                // something to remove
                remove(key);
                return null;
            } else {
                // nothing to do. Leave things as they were.
                return null;
            }
        } else {
            // add or replace old mapping
            put(key, newValue);
            return newValue;
        }
    }

2. 相似的方法

分别是指定的key存在和不存在情况时,使用remappingFunction计算新值,如果新值不为null,则将key的值设置为新值

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

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

3. 示例代码段

#创建或追加内容到指定的key, 作用类似于 map.merge(key, msg, String::concat)
map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))}

#创建或累加计算指定key的次数
map.compute(type, (k, v) -> v == null ? 1 : v + 1);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

enjoy编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值