介绍

以测试用例方式来展示Map的compute()、computeIfPresent()、computeIfAbsent()这三个方法的区别

结论

compute方法=computeIfPresent方法 + computeIfAbsent方法

一、compute(参数一、参数二)方法:

参数一:指定的key
参数二:接口函数(k,v)
结论:
(修改数据) 原始Map指定的key值存在,函数接口返回不会空,则用接口函数返回的结果替换key的value
(删除数据) 原始Map指定的key值存在,函数接口返回为空,删除key对应的数据
(添加数据) 原始Map指定的key值不存在,函数接口返回为不空,则添加一条数据到Map,key:指定的key value:函数返回的结果

二、computeIfPresent(参数一、参数二)

参数一:指定的key
参数二:接口函数(k,v)
结论:
(修改数据) 原始Map指定的key值存在,函数接口返回不会空,则用接口函数返回的结果替换key的value
(删除数据) 原始Map指定的key值存在,函数接口返回为空,删除key对应的数据

三、computeIfAbsent(参数一、参数二)

参数一:指定的key
参数二:接口函数(k)
结论:
(添加数据) 原始Map指定的key值不存在,函数接口返回为不空,则添加一条数据到Map,key:指定的key value:函数返回的结果

测试用例展示

完整代码:地址
为了代码简介,先写一个打印日志的方法:printLogAndReturnParam

/**
   * 打印前两个参数,返回第三参数
   *
   * @param k
   * @param v
   * @param result
   * @return
   */
  public static String printLogAndReturnParam(String k, String v, String result) {
    System.out.print("k-" + k + " ");
    System.out.println("v-" + v);
    return result;
  }

测试用例一、compute方法

测试代码
public void testMapCompute() {
    Map<String, String> map = new LinkedHashMap<>();
    System.out.println("测试场景:compute");
    map.put("k1", "v1");
    map.put("k2", "v2");
    map.put("k3", "v3");
    System.out.print("测试指定key存在,返回值一致:");
    map.compute("k1", (k, v) -> printLogAndReturnParam(k, v, "v1"));
    System.out.print("测试指定key存在,返回值不一致:");
    map.compute("k2", (k, v) -> printLogAndReturnParam(k, v, "VV2"));
    System.out.print("测试指定key存在,返回值为NULL:");
    map.compute("k3", (k, v) -> printLogAndReturnParam(k, v, null));
    System.out.print("测试指定key不存在,返回值NULL:");
    map.compute("k4", (k, v) -> printLogAndReturnParam(k, v, null));
    System.out.print("测试指定key不存在,返回值不为NULL:");
    map.compute("k5", (k, v) -> printLogAndReturnParam(k, v, "VV5"));
    System.out.print("输出结果:" + map);
    System.out.println("结论如下:");
    System.out.println("测试指定key存在,返回值一致:value保持不变");
    System.out.println("测试指定key存在,返回值不一致:value使用返回值");
    System.out.println("测试指定key存在,返回值为NULL:删除该条数据");
    System.out.println("测试指定key不存在,返回值NULL:不添加不删除");
    System.out.println("测试指定key不存在,返回值不为NULL:添加数据,key:指定的key,value:返回值");
  }
日志输出

测试场景:compute
测试指定key存在,返回值一致:k-k1 v-v1
测试指定key存在,返回值不一致:k-k2 v-v2
测试指定key存在,返回值为NULL:k-k3 v-v3
测试指定key不存在,返回值NULL:k-k4 v-null
测试指定key不存在,返回值不为NULL:k-k5 v-null
输出结果:{k1=v1, k2=VV2, k5=VV5}结论如下:
测试指定key存在,返回值一致:value保持不变
测试指定key存在,返回值不一致:value使用返回值
测试指定key存在,返回值为NULL:删除该条数据
测试指定key不存在,返回值NULL:不添加不删除
测试指定key不存在,返回值不为NULL:添加数据,key:指定的key,value:返回值

测试用例二、computeIfPresent方法

测试代码
public void testMapComputeIfPresent() {
    Map<String, String> map = new LinkedHashMap<>();
    System.out.println("测试场景:computeIfPresent");
    map.put("k1", "v1");
    map.put("k2", "v2");
    map.put("k3", "v3");
    System.out.print("测试指定key存在,返回值一致:");
    map.computeIfPresent("k1", (k, v) -> printLogAndReturnParam(k, v, "v1"));
    System.out.print("测试指定key存在,返回值不一致:");
    map.computeIfPresent("k2", (k, v) -> printLogAndReturnParam(k, v, "VV2"));
    System.out.print("测试指定key存在,返回值为NULL:");
    map.computeIfPresent("k3", (k, v) -> printLogAndReturnParam(k, v, null));
    System.out.println("测试指定key不存在,返回值NULL:");
    map.computeIfPresent("k4", (k, v) -> printLogAndReturnParam(k, v, null));
    System.out.println("测试指定key不存在,返回值不为NULL:");
    map.computeIfPresent("k5", (k, v) -> printLogAndReturnParam(k, v, "VV5"));
    System.out.print("输出结果:" + map);
    System.out.println("结论如下:");
    System.out.println("测试指定key存在,返回值一致:value保持不变");
    System.out.println("测试指定key存在,返回值不一致:value使用返回值");
    System.out.println("测试指定key存在,返回值为NULL:删除该条数据");
    System.out.println("测试指定key不存在,返回值NULL:不添加不删除");
    System.out.println("测试指定key不存在,返回值不为NULL:不添加不删除");
  }
日志输出

测试场景:computeIfPresent
测试指定key存在,返回值一致:k-k1 v-v1
测试指定key存在,返回值不一致:k-k2 v-v2
测试指定key存在,返回值为NULL:k-k3 v-v3
测试指定key不存在,返回值NULL:
测试指定key不存在,返回值不为NULL:
输出结果:{k1=v1, k2=VV2}结论如下:
测试指定key存在,返回值一致:value保持不变
测试指定key存在,返回值不一致:value使用返回值
测试指定key存在,返回值为NULL:删除该条数据
测试指定key不存在,返回值NULL:不添加不删除
测试指定key不存在,返回值不为NULL:不添加不删除

测试用例三、computeIfAbsent方法

测试代码
public void testMapComputeIfAbsent() {
    Map<String, String> map = new LinkedHashMap<>();
    System.out.println("测试场景:computeIfAbsent");
    map.put("k1", "v1");
    map.put("k2", "v2");
    map.put("k3", "v3");
    System.out.println("测试指定key1存在,返回值一致");
    map.computeIfAbsent("k1", k -> "v1");
    System.out.println("测试指定key2存在,返回值不一致");
    map.computeIfAbsent("k2", k -> "VV2");
    System.out.println("测试指定key3存在,返回值为NULL");
    map.computeIfAbsent("k3", k -> null);
    System.out.println("测试指定key4不存在,返回值NULL");
    map.computeIfAbsent("k4", k -> null);
    System.out.println("测试指定key5不存在,返回值不为NULL");
    map.computeIfAbsent("k5", k -> "VV5");
    System.out.print("输出结果:" + map);
    System.out.println("结论如下:");
    System.out.println("测试指定key存在,返回值一致:不添加不删除");
    System.out.println("测试指定key存在,返回值不一致:不添加不删除");
    System.out.println("测试指定key存在,返回值为NULL:不添加不删除");
    System.out.println("测试指定key不存在,返回值NULL:不添加不删除");
    System.out.println("测试指定key不存在,返回值不为NULL:添加数据,key:指定的key,value:指定的value");
  }
日志输出

测试场景:computeIfAbsent
测试指定key1存在,返回值一致
测试指定key2存在,返回值不一致
测试指定key3存在,返回值为NULL
测试指定key4不存在,返回值NULL
测试指定key5不存在,返回值不为NULL
输出结果:{k1=v1, k2=v2, k3=v3, k5=VV5}结论如下:
测试指定key存在,返回值一致:不添加不删除
测试指定key存在,返回值不一致:不添加不删除
测试指定key存在,返回值为NULL:不添加不删除
测试指定key不存在,返回值NULL:不添加不删除
测试指定key不存在,返回值不为NULL:添加数据,key:指定的key,value:指定的value

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐