深入掌握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

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4340.html

(0)
LomuLomu
上一篇 2024 年 12 月 24 日
下一篇 2024 年 12 月 24 日

相关推荐

  • 数据库与编程语言的连接

    — title: 数据库与编程语言的连接 date: 2024/12/21 updated: 2024/12/21 author: cmdragon excerpt: 数据库与编程语言的连接是实现数据驱动应用程序的关键环节。通过使用不同的编程语言和数据库驱动程序,开发者可以在应用中实现对数据库的CRUD(创建、读取、更新、删除)操作。 categorie…

    未分类 2024 年 12 月 27 日
    44000
  • Java Druid 面试题

    Druid连接池在项目中有哪些优势? 性能优越:Druid采用了高效的连接管理机制,可以快速地创建和回收数据库连接,减少了连接的创建和销毁带来的性能开销。 监控与统计:Druid提供了详细的监控信息,包括连接池的状态、SQL执行的统计信息等,这有助于性能调优和问题诊断。 SQL日志记录:Druid内置了SQL执行日志记录功能,可以记录所有SQL语句的执行情况…

    未分类 2025 年 1 月 10 日
    39900
  • Spring事务管理深度解析-从实践到原理

    事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制 分类 主要分为编程式事务和声明式事务两种。 编程式事务 是指在代码中手动的管理事务的提交、回滚等操作,代码侵入性比较强,如下示例: “`java try { //TODO something transactionManager.commit(status); } catch (E…

    2024 年 12 月 26 日
    27000
  • MySQL 面试题

    MySQL 中有哪几种锁? 全局锁、行级锁、自增锁、记录锁、外键锁、间隙锁、表级锁、元数据锁、意向锁、临键锁 MySQL 中有哪些不同的表格? 基础表、临时表、系统表、信息表、性能模式表、分区表、外键表、触发器使用的表、存储过程和函数使用的表 简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别? 事务支持 InnoDB:支持事务处理,具有提…

    未分类 2025 年 1 月 10 日
    23000
  • 【前端】javaScript

    目录 一、JavaScript概述 1.1 引入方式 二、基础语法 2.1 变量 2.2 数据类型 2.3 运算符 2.4 对象 2.4.1 数组 2.4.2 函数 2.4.3 对象 三、jQuery 3.1 引入依赖 3.2 jQuery语法 3.3 jQuery选择器 3.4 jQuery事件 3.5 操作元素 3.6 常用方法 一、JavaScript…

    2024 年 12 月 28 日
    34500

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信