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

相关推荐

  • PostgreSQL 数据库的启动与停止管理

    title: PostgreSQL 数据库的启动与停止管理date: 2024/12/28updated: 2024/12/28author: cmdragon excerpt:作为一个强大的开源关系数据库管理系统,PostgreSQL在众多应用场景中发挥着关键作用。在实际使用过程中,对于数据库的启动和停止操作至关重要。这不仅关系到数据库的正常运行,也直接影…

    2025 年 1 月 1 日
    30100
  • manim边做边学–动画轨迹

    本篇介绍Manim中两个和动画轨迹相关的类,AnimatedBoundary和TracedPath。 AnimatedBoundary聚焦于图形边界的动态呈现,能精准控制边界绘制的每一帧,助力我们清晰展示几何图形的搭建流程。 TracedPath则擅长实时追踪物体或点的运动轨迹,以直观且动态的方式呈现各类运动路径,为我们分析和展示复杂运动提供了强大支持 。 …

    2025 年 1 月 6 日
    44900
  • 微服务架构下SpringBoot构建Docker镜像并整合SkyWalking全指南

    一、前言 随着微服务开发模式愈发成熟,微服务的健康状况检测以及服务间的链路追踪成为众多实际运营项目必须考虑的要素。在大型服务平台中,微服务链路追踪有着举足轻重的地位,它不仅能够监控各个服务的健康状态,还能协助开发、测试、运维等人员快速排查、分析并定位线上问题,同时可以对服务运行过程中各服务之间的调用情况以及性能瓶颈点进行定位等,几乎涵盖了服务运行过程中各项重…

    未分类 2025 年 6 月 18 日
    77500
  • 【GreatSQL优化器-10】find_best_ref

    【GreatSQL优化器-10】find_best_ref 一、find_best_ref介绍 GreatSQL的优化器对于join的表需要根据行数和cost来确定最后哪张表先执行哪张表后执行,这里面就涉及到预估满足条件的表数据,在keyuse_array数组有值的情况下,会用find_best_ref函数来通过索引进行cost和rows的估计,并且会找出最…

    2025 年 1 月 10 日
    43500
  • IntelliJ IDEA激活破解补丁下载(IDEA永久激活破解)

    IDEA最新永久激活破解教程:https://www.it1024doc.com/4100.html 破解补丁下载 因为提取的人数比较多,导致分享的百度网盘链接容易被封: 所以需要下载破解补丁的,扫描下方公众号,关注后,发送关键字:0622 即可免费无套路的获取破解补丁!

    2024 年 6 月 22 日
    9.4K00

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信