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

相关推荐

  • 『玩转Streamlit』–集成定时任务

    学习了Streamlit了之后,可以尝试给自己的命令行小工具加一个简单的界面。 本篇总结了我改造自己的数据采集的工具时的一些经验。 1. 概要 与常规的程序相比,数据采集任务的特点很明显,比如它一般都是I/O密集型程序,涉及大量网络请求或文件读写,耗费的时间比较长;而且往往是按照一定的时间间隔周期性地执行。 这样的程序对交互性要求不高,所以我之前都是用命令行…

    2025 年 1 月 12 日
    58900
  • 交易系统:应用层、领域层分层架构设计

    大家好,我是汤师爷~ 线上线下交易系统的应用架构包括终端、应用层、领域层和关联系统。 应用层能力 应用层定义软件的应用功能,负责接收用户请求、协调领域层执行任务并返回结果。主要包括以下模块: 1)C端服务模块 为消费者提供完整的交易链路功能,包括加购、下单、支付、结算、拆单、确认收货和退货退款等。 2)商家后台 为商家提供全面的订单管理功能,包括订单操作、搜…

    2024 年 12 月 28 日
    52800
  • Python深度学习(第2版)PDF免费下载

    适读人群 :想要学习深度学习的学生、职业开发者。 流行深度学习框架Keras之父执笔,涵盖Transformer架构等进展,文字生,简单方式解释复杂概念,不用一个数学公式,利用直觉自然入门深度学习。 电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍 点击原文去下载 书籍信息 作者: [美] 弗朗索瓦·肖莱出版社: 人民邮电出版社出品方…

    2024 年 12 月 30 日
    51600
  • Java中的网络基础认知(如果想知道Java中有关网络基础的知识,那么只看这一篇就足够了!)

    前言:网络基础是现代通信和信息技术的基石,涉及数据传输、网络协议、路由、交换、网络设备以及网络安全等多个方面,深入了解网络基础,不仅能提升技术能力,还能为更复杂的网络架构与应用打下坚实的基础。 ✨✨✨ 这里是秋刀鱼不做梦的BLOG 目录 网络发展史简介 独立模式与网络互连 局域网(LAN) 广域网(WAN) 网络通信基础 —— IP和端口号 IP地址 端口号…

    2024 年 12 月 28 日
    42300
  • Java中的IP协议(如果想知道Java中有关IP协议的知识,那么只看这一篇就足够了!)

    前言:在当今高度信息化的社会中,互联网已经深刻影响了人类的生活方式和交流方式,从电子邮件的收发到视频会议的举行,从社交媒体的互动到云计算的广泛应用,这一切的背后都离不开网络通信协议的支持。 ✨✨ ✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 在正式开始讲解之前,先让我们看一下本文大致的讲解内容: 目录 1.…

    未分类 2025 年 5 月 12 日
    30900

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信