java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java Map映射遍历

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

作者: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 用来统一对象

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

Map<Integer, Function<MqDeadLetterInventory, Result>>

3.更多场景.....

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

4.注意事项

Map.of()函数:

知识扩展

在 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()));
    }
}

注意事项

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

您可能感兴趣的文章:
阅读全文