遍歷 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();
| 方法 | 作用 |
|---|---|
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**,一行代碼解決一鍵多值累計存儲。