文章目录
前言
一、getOrDefault
二、foreach
三、merge
四、putIfAbsent
总结
前言
map的详细方法使用
一、getOrDefault
尝试获取key对应的值,如果未获取到,就返回默认值。
private static void testGetOrDefault() {
Map<String, String> map = new HashMap<>(4);
map.put("1234", "1234");
String key = "key";
String defaultValue = "defaultValue";
// 老写法
String oldValue = defaultValue;
if (map.containsKey(key)) {
oldValue = map.get(key);
}
System.out.println("oldValue = " + oldValue);
// 新写法在获取key的时候如果获取不到就给个默认值
String newValue = map.getOrDefault(key, defaultValue);
System.out.println("newValue = " + newValue);
}
二、foreach
遍历map的数据使用的。
private static void test() {
Map<String, String> map = new HashMap<>(4);
map.put("4123", "1243");
// 老写法
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.printf("老写法 key = %s, value = %s%n", entry.getKey(), entry.getValue());
}
// 新写法
map.forEach((key, value) -> System.out.printf("新写法 key = %s, value = %s%n", key, value));
}
三、merge
合并map
方法接收3个参数:key、value、function。
-
如果key存在,将value按照function做1次计算后,更新到Map中
-
如果key不存在,将key-value放入Map中
我们有1个List,要统计List中每个元素出现的次数。我们要实现的逻辑是,遍历List中的每个元素,如果这个元素在Map中存在,Map中的值+1;如果不存在,则放入Map中,次数(值)为1。
Map<String, Integer> cntMap = new HashMap<>(8);
List<String> list = Arrays.asList("apple", "orange", "banana", "orange");
// 老写法
for (String item : list) {
if (cntMap.containsKey(item)) {
cntMap.put(item, cntMap.get(item) + 1);
} else {
cntMap.put(item, 1);
}
}
// 新写法
for (String item : list) {
cntMap.merge(item, 1, Integer::sum);
}
四、putIfAbsent
不存在key或者值为null时,才将键值对放入Map。跟put方法相比,这个方法不会直接覆盖已有的值,在不允许覆盖旧值的场景使用起来会比较简洁
Map<String, Integer> scoreMap = new HashMap<>(4);
scoreMap.put("Jim", 88);
scoreMap.put("Lily", 90);
// 老写法
if (!scoreMap.containsKey("Lily")) {
scoreMap.put("Lily", 98);
}
// 新写法
scoreMap.putIfAbsent("Lily", 98);
五、computer
computer方法需要传入2个参数:key、function。主要有3步操作
-
获取到key对应的oldValue,可能为null
-
经过function计算获取newValue
-
put(key, newValue)
Map<String, Integer> cntMap = new HashMap<>(8);
List<String> list = Arrays.asList("apple", "orange", "banana", "orange");
// 老写法
for (String item : list) {
if (cntMap.containsKey(item)) {
cntMap.put(item, cntMap.get(item) + 1);
} else {
cntMap.put(item, 1);
}
}
// 新写法
for (String item : list) {
cntMap.compute(item, (k, v) -> {
if (v == null) {
v = 1;
} else {
v += 1;
}
return v;
});
}