HashMap 등, Map 2개를 하나의 Map으로 합치는 방법에 대해서 알아보겠습니다.

1. Map.putAll()을 이용한 방법

map1.putAll(map2)은 map1에 map2의 모든 key-value 값을 추가합니다.

  • Map<String, Integer> mergedMap = new HashMap<>(map1) : map1의 key-value 값을 갖고 있는 새로운 Map 객체 생성
  • mergedMap.putAll(map2) : mergedMap에 map2의 모든 key-value 값 추가
  • 동일한 key가 존재할 때, 늦게 추가되는 map의 key-value로 업데이트 (map1의 “C”-1의 경우, map2의 “C”-3으로 업데이트됨)
import java.util.HashMap;
import java.util.Map;

public class Example {

    public static void main(String[] args) {

        // 첫 번째 Map 생성
        Map<String, Integer> map1 = new HashMap<>();
        map1.put("A", 1);
        map1.put("B", 2);
        map1.put("C", 1);

        // 두 번째 Map 생성
        Map<String, Integer> map2 = new HashMap<>();
        map2.put("C", 3);
        map2.put("D", 4);

        // 새로운 맵 생성, 두 개의 Map을 하나로 합치기
        Map<String, Integer> mergedMap = new HashMap<>(map1);
        mergedMap.putAll(map2);

        // 합쳐진 Map 출력
        System.out.println("Merged Map: " + mergedMap);
    }
}

Output:

Merged Map: {A=1, B=2, C=3, D=4}

2. Map.merge()를 이용한 방법

Map.merge()를 이용하여 두개의 Map을 합칠 수 있습니다.

  • map1.merge(entry.getKey(), entry.getValue(), (v1, v2) -> v1) : map1에 entry의 key와 value를 key-value로 추가, (v1, v2) -> v1은 동일한 key 값이 추가될 때, 이전에 추가된 값(v1)을 사용하겠다는 의미.
  • 아래 예제에서는 “C”가 중복 key인데, map1이 값이 먼저 추가된 값이고 v1이므로, 결국 1로 업데이트됨
  • 중복 key에 대해서 나중에 추가되는 value로 업데이트하려면 (v1, v2) -> v2로 입력
import java.util.HashMap;
import java.util.Map;

public class Example {

    public static void main(String[] args) {

        // 첫 번째 Map 생성
        Map<String, Integer> map1 = new HashMap<>();
        map1.put("A", 1);
        map1.put("B", 2);
        map1.put("C", 1);

        // 두 번째 Map 생성
        Map<String, Integer> map2 = new HashMap<>();
        map2.put("C", 3);
        map2.put("D", 4);

        // merge()로 Map 병합
        for (Map.Entry<String, Integer> entry : map2.entrySet()) {
            map1.merge(entry.getKey(), entry.getValue(), (v1, v2) -> v1);
        }

        // 합쳐진 Map 출력
        System.out.println("Merged Map: " + map1);
    }
}

Output:

Merged Map: {A=1, B=2, C=1, D=4}

3. Stream을 이용한 방법

Stream.concat()을 이용하여 두개의 Map을 하나로 합칠 수 있습니다. Map을 합칠 때, Collectors.toMap()을 사용하는데, 동일 key가 추가될 때, 어떤 것을 업데이트할 지 정할 수 있습니다.

  • Stream.concat(map1.entrySet().stream(), map2.entrySet().stream()) : map1과 map2의 key-value를 합침
  • Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1) : Entry의 getKey()와 getValue() 값을 Map으로 만듬. (v1, v2) -> v1은 동일한 key를 갖고 있는 Entry를 업데이트할 때 value 값은 map1의 value 값(v1)을 사용하겠다는 의미
  • 결과를 보면 중복 key 값 “C”는 map1의 value “1”로 업데이트됨
  • 중복 key에 대해서 나중에 추가되는 value로 업데이트하려면 (v1, v2) -> v2로 입력
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Example {

    public static void main(String[] args) {

        // 첫 번째 Map 생성
        Map<String, Integer> map1 = new HashMap<>();
        map1.put("A", 1);
        map1.put("B", 2);
        map1.put("C", 1);

        // 두 번째 Map 생성
        Map<String, Integer> map2 = new HashMap<>();
        map2.put("C", 3);
        map2.put("D", 4);

        // 두 개의 Map을 스트림을 사용하여 합치기
        Map<String, Integer> mergedMap = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1));

        // 합쳐진 Map 출력
        System.out.println("Merged Map: " + mergedMap);
    }
}

Output:

Merged Map: {A=1, B=2, C=1, D=4}