最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用Map映射遍歷的常用方法總結(jié)

 更新時(shí)間:2026年05月20日 08:59:22   作者:ok云科技  
這篇文章主要為大家詳細(xì)介紹了Java使用Map映射遍歷的常用方法,文中的示例代碼講解詳細(xì)并探討了在不同場(chǎng)景下應(yīng)用這些方法的最佳實(shí)踐,希望對(duì)大家有所幫助

業(yè)務(wù)使用

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

    // 映射:隊(duì)列類型 -> 對(duì)應(yīng)的發(fā)送邏輯
    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("未知的隊(duì)列類型: {}", queueType);
        return;
    }

    // 執(zhí)行發(fā)送
    sendAction.accept(deadLetter);

    // 刪除死信記錄
    int res = mqDeadLetterInventoryMapper.deleteMqDeadLetterInventoryById(deadLetter.getId(), deadLetter.getTenantId());
    if (res <= 0) {
        throw new ServiceException("刪除死信隊(duì)列失敗!");
    }
}

代碼講解

1.相同參數(shù) 沒有返回值,使用:

Map<Integer, Consumer<MqDeadLetterInventory>>

Consumer 用來統(tǒng)一對(duì)象

  • MqDeadLetterInventory參數(shù)類型
  • .get 獲取對(duì)象
  • .accept 執(zhí)行對(duì)象

2.相同參數(shù) 有返回值,使用:

Map<Integer, Function<MqDeadLetterInventory, Result>>
  • Function 用來統(tǒng)一對(duì)象
  • MqDeadLetterInventory參數(shù)類型
  • Result 結(jié)果
  • .get 獲取對(duì)象
  • .apply 執(zhí)行對(duì)象, 執(zhí)行之后會(huì)有返回結(jié)果 Result

3.更多場(chǎng)景.....

其他 參數(shù)不同 等場(chǎng)景,自行根據(jù)需求處理

4.注意事項(xiàng)

Map.of()函數(shù):

  • 參數(shù)不能為null;
  • 數(shù)量不能超過10條;

知識(shí)擴(kuò)展

在 Java 中,Map 是存儲(chǔ)鍵值對(duì)(Key-Value)的數(shù)據(jù)結(jié)構(gòu)。遍歷 Map 時(shí),最核心的是獲取鍵、值或鍵值對(duì)。下面列舉幾種常用的遍歷方法,并給出代碼示例。

1. 使用 entrySet() 遍歷鍵值對(duì)(推薦)

這是效率最高、最常用的方式,直接拿到每個(gè) Map.Entry 對(duì)象,同時(shí)獲取 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() 遍歷鍵,再通過鍵獲取值

適合只需要鍵,或者需要單獨(dú)處理鍵的場(chǎng)景。但因?yàn)槊看?nbsp;get(key) 可能效率稍低(對(duì)于某些 Map 實(shí)現(xiàn)如 TreeMap 或 LinkedHashMap 依然是 O(1),但比 entrySet() 多一次哈希查找)。

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

3. 使用 values() 遍歷所有值(不需要鍵)

如果你只需要處理 Map 中存儲(chǔ)的值,而不關(guān)心鍵。

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

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

代碼最簡潔,底層也是基于 entrySet

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

5. 使用迭代器(Iterator)

當(dāng)需要在遍歷過程中刪除元素時(shí),使用迭代器最安全(避免 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+)

適合需要對(duì)鍵值對(duì)進(jìn)行過濾、映射等操作時(shí)使用。

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

性能對(duì)比與建議

方法性能適用場(chǎng)景
entrySet最高同時(shí)需要 key 和 value,絕大多數(shù)場(chǎng)景推薦
keySet + get略低(多一次查找)僅需要 key,或很少次 get
values只需要 value
forEach與 entrySet 相當(dāng)代碼簡潔,Java 8+ 首選
迭代器稍慢(有額外對(duì)象)需要邊遍歷邊刪除
Stream與 forEach 相當(dāng)需要鏈?zhǔn)教幚恚ㄟ^濾、映射等)

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

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

注意事項(xiàng)

  • 不要在 for-each 循環(huán)中直接刪除元素,否則會(huì)拋出 ConcurrentModificationException。必須使用迭代器或 Java 8 的 removeIf(如 map.entrySet().removeIf(entry -> condition))。
  • 對(duì)于 ConcurrentHashMap 等并發(fā)集合,遍歷時(shí)通常不會(huì)拋出異常,但迭代器不保證反映遍歷期間的修改。
  • 如果 Map 中的 key 或 value 為 null,上述方法均能正常處理(但需注意 HashMap 允許一個(gè) null key 和多個(gè) null value)。

 到此這篇關(guān)于Java使用Map映射遍歷的常用方法總結(jié)的文章就介紹到這了,更多相關(guān)Java Map映射遍歷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)的Base64加密算法示例

    Java實(shí)現(xiàn)的Base64加密算法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的Base64加密算法,結(jié)合實(shí)例形式分析了Java實(shí)現(xiàn)的base64編碼轉(zhuǎn)換相關(guān)使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2018-04-04
  • 消息中間件ActiveMQ的簡單入門介紹與使用

    消息中間件ActiveMQ的簡單入門介紹與使用

    消息隊(duì)列是指利用高效可靠的消息傳遞機(jī)制進(jìn)行與平臺(tái)無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成,這篇文章主要給大家介紹了關(guān)于ActiveMQ的簡單入門介與使用的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • java方法重載和參數(shù)類型自動(dòng)提升方式

    java方法重載和參數(shù)類型自動(dòng)提升方式

    這篇文章主要介紹了java方法重載和參數(shù)類型自動(dòng)提升方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java多線程并發(fā)編程和鎖原理解析

    Java多線程并發(fā)編程和鎖原理解析

    這篇文章主要介紹了Java多線程并發(fā)編程和鎖原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Maven中生命周期深度解析與實(shí)戰(zhàn)指南

    Maven中生命周期深度解析與實(shí)戰(zhàn)指南

    這篇文章主要為大家詳細(xì)介紹了Maven 生命周期實(shí)戰(zhàn)指南,包含核心概念、階段詳解、Spring Boot 特化場(chǎng)景及企業(yè)級(jí)實(shí)踐建議,希望對(duì)大家有一定的幫助
    2025-08-08
  • Java中LinkedList真的是查找慢增刪快

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

    這篇文章主要介紹了Java中LinkedList真的是查找慢增刪快,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • springBoot集成redis(jedis)的實(shí)現(xiàn)示例

    springBoot集成redis(jedis)的實(shí)現(xiàn)示例

    Redis是我們Java開發(fā)中,使用頻次非常高的一個(gè)nosql數(shù)據(jù)庫,本文主要介紹了springBoot集成redis(jedis)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • 關(guān)于easyExcel中讀取Excel表頭的實(shí)例說明

    關(guān)于easyExcel中讀取Excel表頭的實(shí)例說明

    EasyExcel是阿里巴巴開源的一個(gè)excel處理框架,以使用簡單、節(jié)省內(nèi)存著稱,下面這篇文章主要給大家介紹了關(guān)于easyExcel中讀取Excel表頭的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Spring5使用JSR 330標(biāo)準(zhǔn)注解的方法

    Spring5使用JSR 330標(biāo)準(zhǔn)注解的方法

    從Spring3.0之后,除了Spring自帶的注解,我們也可以使用JSR330的標(biāo)準(zhǔn)注解,本文主要介紹了Spring5使用JSR 330標(biāo)準(zhǔn)注解,感興趣的可以了解一下
    2021-09-09
  • JAVA匿名內(nèi)部類語法分析及實(shí)例詳解

    JAVA匿名內(nèi)部類語法分析及實(shí)例詳解

    這篇文章主要介紹了JAVA匿名內(nèi)部類語法分析及實(shí)例詳解,匿名內(nèi)部類可以使你的代碼更加簡潔,它與局部類很相似,不同的是它沒有類名,如果某個(gè)局部類你只需要用一次,那么你就可以使用匿名內(nèi)部類。對(duì)此感興趣的可以了解一下
    2020-07-07

最新評(píng)論

遂宁市| 米脂县| 洛扎县| 高阳县| 中阳县| 霍城县| 无极县| 水富县| 济南市| 保定市| 洛川县| 万年县| 巨野县| 枝江市| 五寨县| 高要市| 鲁山县| 平利县| 上高县| 油尖旺区| 比如县| 潜山县| 屯门区| 上虞市| 宜兰市| 四平市| 彭州市| 灵石县| 赤壁市| 香格里拉县| 右玉县| 莱西市| 福泉市| 久治县| 从江县| 手游| 登封市| 儋州市| 永德县| 合作市| 历史|