破产是一种暂时的困境,贫困是一种思想的状态。——比尔·盖茨

今天在Map中看到了这样一个函数:compute

于是做了点测验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Map<String, String> map = MapUtil.newHashMap();
map.put("123", "456");
map.put("789", "123");
System.out.println("如果存在就执行,并将结果作为value放入map");
map.computeIfPresent("1234", (k, v) -> v + "1 ");
// {123=456, 789=123} 说明未找到指定的key时无更改
System.out.println(map);
map.computeIfPresent("123", (k, v) -> v + "2 ");
// {123=4562 , 789=123} 说明如果找到了对应的key,将value更改为后面的结果
System.out.println(map);
map.computeIfPresent("123", (k, v) -> null);
// {789=123} 说明如果找到对应的key,并且后方传入Function内部apply返回值为null,则移除对应的key
System.out.println(map);
map.computeIfPresent("1234", (k, v) -> null);
// {789=123} 说明如果未找到对应的key,并且后方传入Function内部apply返回值为null,不会更改map
System.out.println(map);
System.out.println("如果缺省就执行,将key作为后方Function的参数,将结果作为value放入map");
map.computeIfAbsent("789", v -> v + "3 ");
// {789=123} 和上方一样,如果key存在,则无变化
System.out.println(map);
map.computeIfAbsent("123", k -> k + "4 ");
// {123=1234 , 789=123} 说明如果key不存在,则将key作为参数,执行后方逻辑返回值再作为value,放入map
System.out.println(map);
map.computeIfAbsent("1234", k -> null);
// {123=1234 , 789=123} 和上方一样,说明即便key不存在,后方函数返回值为null,不会更改map
System.out.println(map);
map.computeIfAbsent("123", k -> null);
// {123=1234 , 789=123} 和上方一样,说明即便key存在,后方函数返回值为null,不会更改map
System.out.println(map);
System.out.println("执行后方逻辑,并将结果作为value放入map");
map.compute("123", (k, v) -> v + "5 ");
// {123=1234 5 , 789=123} 说明如果key存在,执行后方逻辑返回值作为value,放入map
System.out.println(map);
map.compute("1234", (k, v) -> v + "6 ");
// {123=1234 5 , 1234=null6 , 789=123} 说明如果key不存在,执行后方逻辑返回值作为value,放入map,注意此处lambda内部的value为null
System.out.println(map);
map.compute("123", (k, v) -> null);
// {1234=null6 , 789=123} 说明如果key存在,后方函数返回值为null,则会移除对应的key
System.out.println(map);
map.compute("12345", (k, v) -> null);
// {1234=null6 , 789=123} 说明如果key不存在,后方函数返回值为null时,不会更改map
System.out.println(map);

现在基本理解了compute、computeIfPresent、computeIfAbsent的使用了:

以下方法放入map时的key均为方法第一个参数

compute:

返回值状态 未找到指定的key时 找到指定的key时
后方传入lambda返回值不为null 执行后方逻辑返回值作为value,放入map,注意此处lambda内部参数的value为null 执行后方逻辑返回值作为value,放入map
后方传入lambda返回值为null 不会更改map 移除对应的key

computeIfPresent:

返回值状态 未找到指定的key时 找到指定的key时
后方传入lambda返回值不为null 不会更改map 执行后方逻辑返回值作为value,放入map
后方传入lambda返回值为null 不会更改map 移除对应的key

computeIfAbsent:

返回值状态 未找到指定的key时 找到指定的key时
后方传入lambda返回值不为null 则将key作为参数,执行后方逻辑返回值再作为value,放入map 不会更改map
后方传入lambda返回值为null 不会更改map 不会更改map