有多個 Map(如 map1、map2),Key 相同(類型、數量、單價、優惠),需合併為 Map,同 Key 的 Value 累計到 List。
Map map1 = new HashMap<>();
map1.put("類型", "大");
map1.put("數量", "多");
map1.put("單價", 100);
map1.put("優惠", 0.12);
Map map2 = new HashMap<>();
map2.put("類型", "中");
map2.put("數量", "少");
map2.put("單價", 20);
map2.put("優惠", 0.42);
// 合併
Map> merged = new HashMap<>();
Stream.of(map1, map2).forEach(m ->
m.forEach((k, v) ->
merged.computeIfAbsent(k, key -> new ArrayList<>()).add(v)
)
);
// 輸出
merged.forEach((k, v) -> System.out.println(k + ": " + v));
/*
單價: [100, 20]
優惠: [0.12, 0.42]
類型: [大, 中]
數量: [多, 少]
*/
computeIfAbsent(key, ArrayList::new):Key 不存在時原子創建 List,**線程安全**(ConcurrentHashMap)下也適用,避免 NPE。Stream.of(map1, map2):可擴展到 N 個 Map,代碼不變。Object,List 可存放異構對象(String、Integer、Double 混合),取用時需類型轉換/模式匹配。
// 若 Value 為數值,需求「求和」而非「列表」
Map summed = new HashMap<>();
Stream.of(map1, map2).forEach(m ->
m.forEach((k, v) -> {
if (v instanceof Number) {
summed.merge(k, ((Number)v).doubleValue(), Double::sum);
}
})
);
核心模式:**Map + computeIfAbsent + List**,或 **Stream + groupingBy**,靈活應對多源同 Key 數據聚合。