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

Java Map 多源數據合併:同 Key 累計 Value 到 List 完整實現

     編輯:程式設計疑難解答

需求

有多個 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,代碼不變。
  • Value 類型統一為 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 數據聚合。

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