介绍
以测试用例方式来展示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
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
|