Java使用Map映射遍歷的常用方法總結(jié)
業(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 + " -> " + 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) -> System.out.println(key + " -> " + value));
5. 使用迭代器(Iterator)
當(dāng)需要在遍歷過程中刪除元素時(shí),使用迭代器最安全(避免 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+)
適合需要對(duì)鍵值對(duì)進(jìn)行過濾、映射等操作時(shí)使用。
map.entrySet().stream()
.filter(entry -> entry.getValue() > 1)
.forEach(entry -> 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è)nullkey 和多個(gè)nullvalue)。
到此這篇關(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加密算法,結(jié)合實(shí)例形式分析了Java實(shí)現(xiàn)的base64編碼轉(zhuǎn)換相關(guān)使用方法及操作注意事項(xiàng),需要的朋友可以參考下2018-04-04
java方法重載和參數(shù)類型自動(dòng)提升方式
這篇文章主要介紹了java方法重載和參數(shù)類型自動(dòng)提升方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Maven中生命周期深度解析與實(shí)戰(zhàn)指南
這篇文章主要為大家詳細(xì)介紹了Maven 生命周期實(shí)戰(zhàn)指南,包含核心概念、階段詳解、Spring Boot 特化場(chǎng)景及企業(yè)級(jí)實(shí)踐建議,希望對(duì)大家有一定的幫助2025-08-08
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í)例說明
EasyExcel是阿里巴巴開源的一個(gè)excel處理框架,以使用簡單、節(jié)省內(nèi)存著稱,下面這篇文章主要給大家介紹了關(guān)于easyExcel中讀取Excel表頭的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
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

