compute

2021-10-01

java

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

今天在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);

现在基本理解了computecomputeIfPresentcomputeIfAbsent的使用了:

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

compute

返回值状态 未找到指定的key 找到指定的key
后方传入lambda返回值不为null 执行后方逻辑返回值作为value,放入map,注意此处lambda内部参数的valuenull 执行后方逻辑返回值作为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