首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java Map 累計存儲一鍵多值:List 作為 Value 的標準模式

     編輯:程式設計疑難解答

需求

遍歷 Map,將多個值按 Key 累計存入另一 Map,實現 **一個 Key 對應多個 Value**(如 Map>)。

標準實現


Map> multiMap = new HashMap<>();

// 方式 1:手動檢查
for (Map.Entry entry : sourceMap.entrySet()) {
    String key = entry.getKey();
    Object val = entry.getValue();
    multiMap.computeIfAbsent(key, k -> new ArrayList<>()).add(val);
}

// 方式 2:Java 8+ Stream
Map> multiMap = sourceMap.entrySet().stream()
    .collect(Collectors.groupingBy(
        Map.Entry::getKey,
        Collectors.mapping(Map.Entry::getValue, Collectors.toList())
    ));

// 方式 3:Guava Multimap(推薦生產環境)
Multimap multimap = ArrayListMultimap.create();
for (Map.Entry e : sourceMap.entrySet()) {
    multimap.put(e.getKey(), e.getValue());
}
// 轉回標準 Map
Map> standardMap = multimap.asMap();

關鍵 API 解析

方法作用
computeIfAbsent(key, mappingFunction)Key 不存在時原子創建 Value(線程安全需 ConcurrentHashMap),避免 NPE
Collectors.groupingBy流式分組,聲明式、簡潔
Multimap專用一鍵多值集合,API 豐富(get、removeAll、keys、entries)、無需手動管理 List

設計建議

  • 內部實現優先用 ArrayList(有序、允許重複),需去重改 LinkedHashSet。
  • 高併發場景用 ConcurrentHashMap> + computeIfAbsent 或 ConcurrentLinkedQueue。
  • 序列化/傳輸時,Multimap.asMap() 返回標準 Map>,兼容 JSON 庫。

核心模式:**Map<K, List<V>> + computeIfAbsent**,或直接用 **Guava Multimap**,一行代碼解決一鍵多值累計存儲。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved