1、概述
在JAVA8的Map接口中,增加了一个computeIfAbsent,方法签名如下:
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
Function
是一个函数式接口
R apply(T t);
此方法首先判断缓存map
中是否存在指定的key
值,如果不存在,会自动调用mappingFunction(key)
计算key
的value
,然后将key = value
放入到缓存map
如果mappingFunction(key)
返回的值为null
或抛出异常,则不会有记录存入map
2、代码示例
2.1 示例1
Map<String, String> map = new HashMap<>();
// java8之前,从map中根据key获取value操作可能会下面的操作
String key = map.get("key");
if (key == null) {
key = "hh";
map.put("key", key);
} else {
// 如果key对应的value值存在,进行相应的操作
}
// java8之后,上面的操作可以简化为一行,若key的value值为空,会将第二个参数的返回值存入并返回
String val = map.computeIfAbsent("key1", k -> "test");
System.out.println(map);
// 打印:{key1=test, key=hh}
2.2 示例2
Map<String, AtomicInteger> map = new HashMap<>();
// 统计字段出现个数
List<String> list = Lists.newArrayList("apple", "orange", "banana", "orange", "banana",
"orange");
list.forEach(str -> map.computeIfAbsent(str, k -> new AtomicInteger()).getAndIncrement());
// 遍历
map.forEach((k, v) -> System.out.println(k + ": " + v));
2.2 示例3
Map<String, List<String>> map = new HashMap<>();
// 如果key不存在,则创建新list并放入数据;key存在,则直接往list放入数据
map.computeIfAbsent("fruit", k -> new ArrayList<>()).add("apple");
map.computeIfAbsent("fruit", k -> new ArrayList<>()).add("orange");
map.computeIfAbsent("language", k -> new ArrayList<>()).add("english");
// 遍历
map.forEach((k, v) -> System.out.println(k + " " + v));
遍历
map.forEach((k, v) -> System.out.println(k + " " + v));