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 + " -> " + value);
}3. 使用 values() 遍历所有值(不需要键)
如果你只需要处理 Map 中存储的值,而不关心键。
for (Integer value : map.values()) {
System.out.println(value);
}4. 使用 forEach() 方法(Lambda 表达式,Java 8+)
代码最简洁,底层也是基于 entrySet。
map.forEach((key, value) -> System.out.println(key + " -> " + value));
5. 使用迭代器(Iterator)
当需要在遍历过程中删除元素时,使用迭代器最安全(避免 ConcurrentModificationException)。
Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Integer> entry = iterator.next();
if (entry.getValue() == 2) {
iterator.remove(); // 安全删除
}
}6. 使用 Stream API(Java 8+)
适合需要对键值对进行过滤、映射等操作时使用。
map.entrySet().stream()
.filter(entry -> entry.getValue() > 1)
.forEach(entry -> 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允许一个nullkey 和多个nullvalue)。
到此这篇关于Java使用Map映射遍历的常用方法总结的文章就介绍到这了,更多相关Java Map映射遍历内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
聊聊springboot2.2.3升级到2.4.0单元测试的区别
这篇文章主要介绍了springboot 2.2.3 升级到 2.4.0单元测试的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-10-10
Java easyExcel实现导入多sheet的Excel
这篇文章主要为大家详细介绍了如何使用Java easyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下2025-06-06


最新评论