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

冷不防 2021-12-09 15:45 548阅读 0赞

一、介绍

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

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

二、使用

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

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

  1. public class Main {
  2. public static void main(String[] args) {
  3. // 原对象
  4. Map<String, Object> oldUser = new HashMap<String, Object>(){
  5. {
  6. put("id", 1001);
  7. put("name", "张三");
  8. put("age", 22);
  9. put("hobby", "篮球");
  10. }};
  11. // 新对象
  12. Map<String, Object> newUser = new HashMap<String, Object>(){
  13. {
  14. put("id", 1001);
  15. put("age", 23);
  16. put("hobby", "足球");
  17. }};
  18. System.out.println("oldUser -> " + oldUser);
  19. // 新对象的k-v集合
  20. Set<Map.Entry<String, Object>> entries = newUser.entrySet();
  21. // 循环新对象的Map集合,将其与老的对象的集合进行对比。
  22. // 如果新修改的键值,在老对象的中存在,将使用新集合的值替换老集合的值
  23. // 否则保持原有的老值不变。
  24. for (Map.Entry<String, Object> entry : entries) {
  25. oldUser.computeIfPresent(entry.getKey(), (k, v) -> {
  26. if (oldUser.containsKey(k)) {
  27. // 进行新值替换老值操作
  28. return entry.getValue();
  29. }
  30. // 保存原值,如果这里固定返回null,则表示在删除对象的key-value.
  31. return v;
  32. });
  33. }
  34. System.out.println("--------------------经过替换过--------------------------");
  35. System.out.println("oldUser - > " + oldUser);
  36. }
  37. }

代码运行结果如下:

  1. oldUser -> {name=张三, id=1001, age=22, hobby=篮球}
  2. --------------------经过替换过--------------------------
  3. 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键值对

    1. public class Main {
    2. public static void main(String[] args) {
    3. // 原对象
    4. Map<String, Object> map = new HashMap<String, Object>(){
    5. {
    6. put("id", 1001);
    7. put("name", "张三");
    8. put("age", 22);
    9. put("hobby", "篮球");
    10. }};
    11. System.out.println("map -> " + map);
    12. System.out.println("-------------运算后-------------------");
    13. map.computeIfPresent("name", (k, v) -> {
    14. return null;
    15. });
    16. System.out.println("map -> " + map);
    17. }
    18. }

    结果如下:发现name在map中已经不存在了。

    1. map -> {name=张三, id=1001, age=22, hobby=篮球}
    2. -------------运算后-------------------
    3. map -> {id=1001, age=22, hobby=篮球}

发表评论

表情:
评论列表 (有 0 条评论,548人围观)

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

相关阅读