# Map接口及其子类的高效方法应用
在编程世界中,`Map` 接口及其子类如 `HashMap` 和 `ConcurrentHashMap` 是我们频繁使用的集合类型。熟悉 `Map` 接口提供的方法,意味着你已经掌握了其子类中的方法,无论它们是否为并发集合。
自 JDK 8 以来,`Map` 接口引入了一些创新的方法,这些方法极大地提升了数据操作的便捷性和代码的可读性。随着 JDK 的演进,最新版本已经更新至 21,尽管 JDK 8 中新增的方法已不再“新”,但如果你还未能熟练掌握它们,那么在技术发展迅速的今天,你可能会发现自己“落后”了。
## 为什么再次强调这些方法?
重要的事情值得重复三遍。如果你还没有记住,那么让我们再次回顾这些在 `HashMap` 中非常实用但常被忽视的方法。
### 1. getOrDefault
**功能**:根据指定的键获取值,如果键不存在,则返回一个预设的默认值。
**示例代码**:
```java
Map map = new HashMap<>(4);
map.put("123", "123");
String key = "key";
String defaultValue = "defaultValue";
// 传统写法
String oldValue = defaultValue;
if (map.containsKey(key)) {
oldValue = map.get(key);
}
// 输出:defaultValue = defaultValue,realValue=null
System.out.println("defaultValue = " + oldValue + ",realValue=" + map.get(key));
// 优雅写法
String newValue = map.getOrDefault(key, defaultValue);
// 输出:defaultValue = defaultValue,realValue=null
System.out.println("defaultValue = " + newValue + ",realValue=" + map.get(key));
优点:减少了对 containsKey
的显式调用,简化了代码逻辑。
2. forEach
功能:提供了一种更为方便的方法来遍历 Map
中的键值对。
示例代码:
Map map = new HashMap<>(4);
map.put("111", "111");
// 传统写法
for (Map.Entry 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));
优点:代码更加简洁,可以直接使用 Lambda 表达式进行操作。
3. merge
功能:用于合并键值对,根据指定的逻辑更新或插入值。
工作原理:如果键存在,应用合并函数计算新值,并更新到 Map
中。如果键不存在,将键值对直接插入到 Map
中。
示例代码:
Map map = new HashMap<>(8);
List list = Arrays.asList("a", "b", "c");
// 传统写法
for (String item : list) {
if (map.containsKey(item)) {
map.put(item, map.get(item) + 1);
} else {
map.put(item, 1);
}
}
System.out.println(map); // 输出:{a=1, b=1, c=1}
Map map1 = new HashMap<>(8);
// 简洁写法
for (String item : list) {
map1.merge(item, 1, Integer::sum);
}
System.out.println(map1); // 输出:{a=1, b=1, c=1}
优点:用一行代码即可实现计数逻辑,避免了显式的检查,简化了复杂流程。
4. putIfAbsent
功能:仅在键不存在或值为 null
时,插入新的键值对。
示例代码:
Map map = new HashMap<>(4);
map.put("Jim", 5);
map.put("Lily", 10);
// 传统写法
if (!map.containsKey("Lily")) {
map.put("Lily", 10);
}
// 简洁写法
map.putIfAbsent("Jim", 5);
System.out.println(map); // 输出:{Lily=10, Jim=5}
优点:避免了重复检查逻辑,使代码更加直观。
5. compute
功能:通过函数对键对应的值进行动态计算。
典型应用场景:计数或根据复杂逻辑更新值。
示例代码:
```java
Map
文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4340.html