Java使用Map映射遍历的常用方法总结

 更新时间:2026年05月20日 08:59:22   作者:ok云科技  
这篇文章主要为大家详细介绍了Java使用Map映射遍历的常用方法,文中的示例代码讲解详细并探讨了在不同场景下应用这些方法的最佳实践,希望对大家有所帮助

业务使用

private void handleResend(MqDeadLetterInventory deadLetter) {
    if (deadLetter == null || deadLetter.getQueueType() == null) {
        return;
    }

    // 映射:队列类型 -> 对应的发送逻辑
    Map<Integer, Consumer<MqDeadLetterInventory>> sendActionMap = Map.of(
            MqConstants.INVENTORY_SKU_QUEUE, inventorySkuMqService::sendInventorySkuMq,
            MqConstants.INVENTORY_WAREHOUSE_QUEUE, inventoryWarehouseMqService::sendInventoryWarehouseMq,
            MqConstants.INVENTORY_INVOICE_QUEUE, invoiceStockMqService::sendInvoiceStockMq,
            MqConstants.INVENTORY_LOCATION_QUEUE, locationInventoryMqService::sendInventoryLocationMq
    );

    Integer queueType = deadLetter.getQueueType();
    Consumer<MqDeadLetterInventory> sendAction = sendActionMap.get(queueType);

    if (sendAction == null) {
        log.warn("未知的队列类型: {}", queueType);
        return;
    }

    // 执行发送
    sendAction.accept(deadLetter);

    // 删除死信记录
    int res = mqDeadLetterInventoryMapper.deleteMqDeadLetterInventoryById(deadLetter.getId(), deadLetter.getTenantId());
    if (res <= 0) {
        throw new ServiceException("删除死信队列失败!");
    }
}

代码讲解

1.相同参数 没有返回值,使用:

Map<Integer, Consumer<MqDeadLetterInventory>>

Consumer 用来统一对象

  • MqDeadLetterInventory参数类型
  • .get 获取对象
  • .accept 执行对象

2.相同参数 有返回值,使用:

Map<Integer, Function<MqDeadLetterInventory, Result>>
  • Function 用来统一对象
  • MqDeadLetterInventory参数类型
  • Result 结果
  • .get 获取对象
  • .apply 执行对象, 执行之后会有返回结果 Result

3.更多场景.....

其他 参数不同 等场景,自行根据需求处理

4.注意事项

Map.of()函数:

  • 参数不能为null;
  • 数量不能超过10条;

知识扩展

在 Java 中,Map 是存储键值对(Key-Value)的数据结构。遍历 Map 时,最核心的是获取键、值或键值对。下面列举几种常用的遍历方法,并给出代码示例。

1. 使用 entrySet() 遍历键值对(推荐)

这是效率最高、最常用的方式,直接拿到每个 Map.Entry 对象,同时获取 key 和 value。

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
    String key = entry.getKey();
    Integer value = entry.getValue();
    System.out.println(key + " -> " + value);
}

2. 使用 keySet() 遍历键,再通过键获取值

适合只需要键,或者需要单独处理键的场景。但因为每次 get(key) 可能效率稍低(对于某些 Map 实现如 TreeMap 或 LinkedHashMap 依然是 O(1),但比 entrySet() 多一次哈希查找)。

for (String key : map.keySet()) {
    Integer value = map.get(key);
    System.out.println(key + " -&gt; " + value);
}

3. 使用 values() 遍历所有值(不需要键)

如果你只需要处理 Map 中存储的值,而不关心键。

for (Integer value : map.values()) {
    System.out.println(value);
}

4. 使用 forEach() 方法(Lambda 表达式,Java 8+)

代码最简洁,底层也是基于 entrySet

map.forEach((key, value) -&gt; System.out.println(key + " -&gt; " + value));

5. 使用迭代器(Iterator)

当需要在遍历过程中删除元素时,使用迭代器最安全(避免 ConcurrentModificationException)。

Iterator&lt;Map.Entry&lt;String, Integer&gt;&gt; iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry&lt;String, Integer&gt; entry = iterator.next();
    if (entry.getValue() == 2) {
        iterator.remove();   // 安全删除
    }
}

6. 使用 Stream API(Java 8+)

适合需要对键值对进行过滤、映射等操作时使用。

map.entrySet().stream()
    .filter(entry -&gt; entry.getValue() &gt; 1)
    .forEach(entry -&gt; System.out.println(entry.getKey()));

性能对比与建议

方法性能适用场景
entrySet最高同时需要 key 和 value,绝大多数场景推荐
keySet + get略低(多一次查找)仅需要 key,或很少次 get
values只需要 value
forEach与 entrySet 相当代码简洁,Java 8+ 首选
迭代器稍慢(有额外对象)需要边遍历边删除
Stream与 forEach 相当需要链式处理(过滤、映射等)

完整示例(整合多种方式)

import java.util.*;
public class MapTraversalDemo {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("Java", 1);
        map.put("Python", 2);
        map.put("C++", 3);
        // 1. entrySet + for-each
        for (Map.Entry<String, Integer> e : map.entrySet()) {
            System.out.println(e.getKey() + " = " + e.getValue());
        }
        // 2. keySet
        for (String key : map.keySet()) {
            System.out.println(key + " = " + map.get(key));
        }
        // 3. values
        for (Integer v : map.values()) {
            System.out.println(v);
        }
        // 4. forEach lambda
        map.forEach((k, v) -> System.out.println(k + " = " + v));
        // 5. iterator with removal
        Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator();
        while (it.hasNext()) {
            if (it.next().getValue() == 2) {
                it.remove();
            }
        }
        // 6. stream
        map.entrySet().stream()
            .filter(e -> e.getValue() > 1)
            .forEach(e -> System.out.println(e.getKey()));
    }
}

注意事项

  • 不要在 for-each 循环中直接删除元素,否则会抛出 ConcurrentModificationException。必须使用迭代器或 Java 8 的 removeIf(如 map.entrySet().removeIf(entry -> condition))。
  • 对于 ConcurrentHashMap 等并发集合,遍历时通常不会抛出异常,但迭代器不保证反映遍历期间的修改。
  • 如果 Map 中的 key 或 value 为 null,上述方法均能正常处理(但需注意 HashMap 允许一个 null key 和多个 null value)。

 到此这篇关于Java使用Map映射遍历的常用方法总结的文章就介绍到这了,更多相关Java Map映射遍历内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 聊聊springboot2.2.3升级到2.4.0单元测试的区别

    聊聊springboot2.2.3升级到2.4.0单元测试的区别

    这篇文章主要介绍了springboot 2.2.3 升级到 2.4.0单元测试的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java easyExcel实现导入多sheet的Excel

    Java easyExcel实现导入多sheet的Excel

    这篇文章主要为大家详细介绍了如何使用Java easyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2025-06-06
  • Java JDK1.8 安装和环境配置教程详解

    Java JDK1.8 安装和环境配置教程详解

    文章简要介绍了JDK 1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,最后通过命令行验证安装是否成功,感兴趣的朋友一起看看吧
    2025-07-07
  • java 使用异常的好处总结

    java 使用异常的好处总结

    这篇文章主要介绍了java 使用异常的好处总结的相关资料,需要的朋友可以参考下
    2017-03-03
  • Java网络编程基础篇之单向通信

    Java网络编程基础篇之单向通信

    这篇文章主要介绍了Java网络编程里通过套接字实现单向通信的方法及相关实例,属于网络编程入门程序,虽然简单,但具有一定参考价值,需要的朋友可以参考下。
    2017-09-09
  • Java 集合框架底层数据结构实现深度解析(示例详解)

    Java 集合框架底层数据结构实现深度解析(示例详解)

    Java 集合框架(Java Collections Framework, JCF)是支撑高效数据处理的核心组件,其底层数据结构的设计直接影响性能与适用场景,这篇文章主要介绍Java集合框架底层数据结构实现深度解析,需要的朋友可以参考下
    2025-06-06
  • SpringBoot整合Xxl-Job的完整步骤记录

    SpringBoot整合Xxl-Job的完整步骤记录

    这篇文章主要给大家介绍了关于SpringBoot整合Xxl-Job的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • mybatis-plus 实现查询表名动态修改的示例代码

    mybatis-plus 实现查询表名动态修改的示例代码

    通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus 实现查询表名动态修改的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • jvm支持最大线程数简单测试

    jvm支持最大线程数简单测试

    这篇文章主要介绍了jvm支持最大线程数简单测试,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java并发编程之Executor接口的使用

    Java并发编程之Executor接口的使用

    今天给大家带来的是关于Java并发编程的相关知识,文章围绕着Executor接口的使用展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06

最新评论