Map中的computeIfAbsent方法

x33g5p2x  于2022-05-25 转载在 其他  
字(1.6k)|赞(0)|评价(0)|浏览(325)

1、概述

在JAVA8的Map接口中,增加了一个computeIfAbsent,方法签名如下:

default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)

Function是一个函数式接口

R apply(T t);

此方法首先判断缓存map中是否存在指定的key值,如果不存在,会自动调用mappingFunction(key)计算keyvalue,然后将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));

相关文章