破产是一种暂时的困境,贫困是一种思想的状态。——比尔·盖茨
今天在Map中看到了这样一个函数:compute
于是做了点测验
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 |