深入掌握Map的这8个操作方法,让代码更简洁优雅

# 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 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) +

相关文章

暂无评论

暂无评论...