Java使用Map映射遍歷的常用方法總結
業(yè)務使用
private void handleResend(MqDeadLetterInventory deadLetter) {
if (deadLetter == null || deadLetter.getQueueType() == null) {
return;
}
// 映射:隊列類型 -> 對應的發(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("未知的隊列類型: {}", queueType);
return;
}
// 執(zhí)行發(fā)送
sendAction.accept(deadLetter);
// 刪除死信記錄
int res = mqDeadLetterInventoryMapper.deleteMqDeadLetterInventoryById(deadLetter.getId(), deadLetter.getTenantId());
if (res <= 0) {
throw new ServiceException("刪除死信隊列失??!");
}
}
代碼講解
1.相同參數 沒有返回值,使用:
Map<Integer, Consumer<MqDeadLetterInventory>>
Consumer 用來統(tǒng)一對象
- MqDeadLetterInventory參數類型
- .get 獲取對象
- .accept 執(zhí)行對象
2.相同參數 有返回值,使用:
Map<Integer, Function<MqDeadLetterInventory, Result>>
- Function 用來統(tǒng)一對象
- MqDeadLetterInventory參數類型
- Result 結果
- .get 獲取對象
- .apply 執(zhí)行對象, 執(zhí)行之后會有返回結果 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 實現(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 中存儲的值,而不關心鍵。
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循環(huán)中直接刪除元素,否則會拋出ConcurrentModificationException。必須使用迭代器或 Java 8 的removeIf(如map.entrySet().removeIf(entry -> condition))。 - 對于
ConcurrentHashMap等并發(fā)集合,遍歷時通常不會拋出異常,但迭代器不保證反映遍歷期間的修改。 - 如果
Map中的 key 或 value 為null,上述方法均能正常處理(但需注意HashMap允許一個nullkey 和多個nullvalue)。
到此這篇關于Java使用Map映射遍歷的常用方法總結的文章就介紹到這了,更多相關Java Map映射遍歷內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springBoot集成redis(jedis)的實現(xiàn)示例
Redis是我們Java開發(fā)中,使用頻次非常高的一個nosql數據庫,本文主要介紹了springBoot集成redis(jedis)的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2023-09-09

