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映射遍历内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现的Base64加密算法示例

    Java实现的Base64加密算法示例

    这篇文章主要介绍了Java实现的Base64加密算法,结合实例形式分析了Java实现的base64编码转换相关使用方法及操作注意事项,需要的朋友可以参考下
    2018-04-04
  • 消息中间件ActiveMQ的简单入门介绍与使用

    消息中间件ActiveMQ的简单入门介绍与使用

    消息队列是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成,这篇文章主要给大家介绍了关于ActiveMQ的简单入门介与使用的相关资料,需要的朋友可以参考下
    2021-11-11
  • java方法重载和参数类型自动提升方式

    java方法重载和参数类型自动提升方式

    这篇文章主要介绍了java方法重载和参数类型自动提升方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java多线程并发编程和锁原理解析

    Java多线程并发编程和锁原理解析

    这篇文章主要介绍了Java多线程并发编程和锁原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Maven中生命周期深度解析与实战指南

    Maven中生命周期深度解析与实战指南

    这篇文章主要为大家详细介绍了Maven 生命周期实战指南,包含核心概念、阶段详解、Spring Boot 特化场景及企业级实践建议,希望对大家有一定的帮助
    2025-08-08
  • Java中LinkedList真的是查找慢增删快

    Java中LinkedList真的是查找慢增删快

    这篇文章主要介绍了Java中LinkedList真的是查找慢增删快,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • springBoot集成redis(jedis)的实现示例

    springBoot集成redis(jedis)的实现示例

    Redis是我们Java开发中,使用频次非常高的一个nosql数据库,本文主要介绍了springBoot集成redis(jedis)的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 关于easyExcel中读取Excel表头的实例说明

    关于easyExcel中读取Excel表头的实例说明

    EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称,下面这篇文章主要给大家介绍了关于easyExcel中读取Excel表头的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Spring5使用JSR 330标准注解的方法

    Spring5使用JSR 330标准注解的方法

    从Spring3.0之后,除了Spring自带的注解,我们也可以使用JSR330的标准注解,本文主要介绍了Spring5使用JSR 330标准注解,感兴趣的可以了解一下
    2021-09-09
  • JAVA匿名内部类语法分析及实例详解

    JAVA匿名内部类语法分析及实例详解

    这篇文章主要介绍了JAVA匿名内部类语法分析及实例详解,匿名内部类可以使你的代码更加简洁,它与局部类很相似,不同的是它没有类名,如果某个局部类你只需要用一次,那么你就可以使用匿名内部类。对此感兴趣的可以了解一下
    2020-07-07

最新评论