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

相关推荐

  • 华为OD机试E卷 –关联子串–24年OD统一考试(Java & JS & Python & C & C++)

    文章目录 题目描述 输入描述 输出描述 用例 题目解析 JS算法源码 Java算法源码 python算法源码 c算法源码 c++算法源码 题目描述 给定两个 字符串 str1和str2,如果字符串str1中的字符,经过排列组合后的字符串中,只要有一个字符串是str2的子串,则认为str1是str2的关联子串。若str1是str2的关联子串,请返回子串在str…

    未分类 2025 年 1 月 10 日
    43800
  • Python深度学习(第2版)PDF免费下载

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

    2024 年 12 月 30 日
    42800
  • TCP-UDP调试工具推荐:Socket通信测试教程(附详细图解)

    前言 在网络编程与应用开发中,调试始终是一项不可忽视的重要环节。尤其是在涉及TCP/IP、UDP等底层网络通信协议时,如何确保数据能够准确无误地在不同节点间传输,是许多开发者关注的核心问题。 调试的难点不仅在于定位连接建立、数据流控制及错误处理等问题,还在于快速、高效地解决这些问题。因此,一款强大且专业的调试工具,能够帮助开发者更直观地理解网络行为,简化问题…

    2024 年 12 月 30 日
    81500
  • 数据结构(Java版)第五期:ArrayList与顺序表(下)

    目录 一、用数组实现顺序表 一、用数组实现顺序表 我们提到过,顺序表是基于数组的封装,这次我们以int为例,用数组去实现一个顺序表。 “`java public class MyArrayList { private int[] arr; public MyArrayList(int capacity){//指定初始容量 arr = new int[cap…

    2024 年 12 月 31 日
    43200
  • 基于Java的大疆无人机云端控制开发指南

    欢迎来到技术探索者的开发空间更多精彩内容请访问我的技术博客 开发者笔记-CSDN博客目录前言开发准备工作搭建开发环境注册大疆开发者账户获取大疆开发工具包大疆SDK深度解析SDK分类与特性云端API运行机制Java控制无人机实战工程创建与依赖配置认证信息设置设备连接流程飞行指令实现影像系统操作示例代码与场景应用完整控制程序行业应用实例疑难问题解答连接异常处理编…

    2025 年 5 月 15 日
    71600

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信