網頁

2019/12/12

Java Lambda merge List<Map<K, V>> to one Map<K, V>

Java 使用lambda語法將List<Map<K, V>>合併為一個Map<K, V>

例如下面把的List<Map<Integer, String>>轉成單一個Map<Integer, String>

Map<Integer, String> m1 = new HashMap<>();
m1.put(1, "A");
m1.put(2, "B");
m1.put(3, "C");

Map<Integer, String> m2 = new HashMap<>();
m2.put(3, "CC");
m2.put(4, "D");
m2.put(5, "E");
m2.put(6, "F");

List<Map<Integer, String>> mapList = Arrays.asList(m1, m2);

Map<Integer,String> mergedMap = mapList.stream()
        .flatMap(map -> map.entrySet().stream()) // 返回Stream<Set<Map.Entry<Integer, String>>>
        .collect(Collectors.toMap(
                        Map.Entry::getKey,       // (entry) -> ((Map.Entry<Integer, String>) entry).getKey()
                        Map.Entry::getValue,     // (entry) -> ((Map.Entry<Integer, String>) entry).getValue(), 
                        (v1, v2) -> v1 + v2));   // 決定相同key的元素值如何合併,例如m1中的{3="C"}及m2中的{3="CC"}

mergedMap.forEach((k, v) -> {
    System.out.println("k:" + k + ", v:" + v);
});

印出如下。

k:1, v:A
k:2, v:B
k:3, v:CCC
k:4, v:D
k:5, v:E
k:6, v:F


參考:

沒有留言:

張貼留言