Java基础之Java8中Map的computeIfPresent的使用

一、介绍

首先先来看看JDK8文档对其的方法说明描述。

方法的字面意思为:如果存在就进行compute(计算)
在这里插入图片描述
如果看了上面的文档描述你还不是很懂的话,可以先看下的例子,然后回过头再看上面的说明,你就会明白。

二、使用

我们还是结合的具体的案例来说明,这样好理解。

我们假设有这样一个javaBean对象,其中有id,name,age,hobby四个字段的值。现在我们假设有一个对其新增/修改的接口,要实现的javaBean对象中的修改新值的热替换,而非全部替换,其实这样的需求很常见。举个例子:假如说我们现在有一个User对象,数据库中其id,name, age,hobby 的值分别是:1001, "张三”, 22, “篮球”。而我们这样一个对象提供了一个修改的接口,每次修改只需要把修改的字段名和字段值及id传递过来,我们后台做到动态修改值修改的对象,其余值保存原有值。这样的对象,我们使用HashMap来表示。

public class Main {

    public static void main(String[] args) {
        // 原对象
        Map<String, Object> oldUser = new HashMap<String, Object>(){{
            put("id", 1001);
            put("name", "张三");
            put("age", 22);
            put("hobby", "篮球");
        }};

        // 新对象
        Map<String, Object> newUser = new HashMap<String, Object>(){{
            put("id", 1001);
            put("age", 23);
            put("hobby", "足球");
        }};
        System.out.println("oldUser -> " + oldUser);

        // 新对象的k-v集合
        Set<Map.Entry<String, Object>> entries = newUser.entrySet();
        // 循环新对象的Map集合,将其与老的对象的集合进行对比。
        // 如果新修改的键值,在老对象的中存在,将使用新集合的值替换老集合的值
        // 否则保持原有的老值不变。
        for (Map.Entry<String, Object> entry : entries) {
            oldUser.computeIfPresent(entry.getKey(), (k, v) -> {
                if (oldUser.containsKey(k)) {
                    // 进行新值替换老值操作
                    return entry.getValue();
                }
                // 保存原值,如果这里固定返回null,则表示在删除对象的key-value.
                return v;
            });
        }
        System.out.println("--------------------经过替换过--------------------------");
        System.out.println("oldUser - > " + oldUser);
    }
}

代码运行结果如下:

oldUser -> {name=张三, id=1001, age=22, hobby=篮球}
--------------------经过替换过--------------------------
oldUser - > {name=张三, id=1001, age=23, hobby=足球}

其实不难看出,computeIfPresent其实compute的一种特殊情况,compute一般包括两种情况:一种key对应的值在map中存在;另一种则是key对应的值在map中不存在。之所以分两种情况,是因为我们实际中往往需要针对这两种情况做不同的操作处理。

比如拿上面的例子说明,只有当user的值被修改时,我们才会替换原有对象的相应的key的值,否则就保持不变。在实际项目中,往往还有更多的情况,比如说,在替换旧值是,做个和运算或者统一加个前缀等等。

标题

如果不理解第二个参数BiFunction<? super K, ? super V, ? extends V> remappingFunction或者compute方法的,请查看我的前一篇文章。Java基础之Java8中Map的compute的使用

三、总结

  1. 值得我们注意的是,在computeIfPresent中,如果我们返回null,则表示在map中移除对应的key-value键值对
    public class Main {
    
    public static void main(String[] args) {
        // 原对象
        Map<String, Object> map = new HashMap<String, Object>(){{
            put("id", 1001);
            put("name", "张三");
            put("age", 22);
            put("hobby", "篮球");
        }};
    
        System.out.println("map -> " + map);
        System.out.println("-------------运算后-------------------");
        map.computeIfPresent("name", (k, v) -> {
            return null;
        });
        System.out.println("map -> " + map);
    
    }
    }
    
    
    结果如下:发现name在map中已经不存在了。
    map -> {name=张三, id=1001, age=22, hobby=篮球}
       -------------运算后-------------------
    map -> {id=1001, age=22, hobby=篮球}
    
  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值