[Java 8+] Map과 merge(), compute()

2025. 8. 30. 17:23·Java/Modern Java(8~)

[Java 8+] Map.merge(), Map.compute()

Map은 백엔드 개발에서도 자주 사용되는 컬렉션이고, PS 문제를 풀 때도 자주 등장하는 컬렉션이다.
키의 존재 유무를 파악하고, 그 값에 따라 저장하는 값이 달라지는 형태의 문제를 자주 봤을 것이다.

 

자바의 Map 라이브러리에는 키가 이미 존재할 때 값 갱신을 간편하게 처리할 수 있는 유용한 메서드들이 있다. 그중 대표적인 것이 merge와 compute이다.

Merge

Map.merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)

  • 특정 키에 대해 새 값을 병합하는 메서드이다.
  • 동작 방식은 다음과 같다.
    1. 키가 존재하지 않으면 value를 그대로 삽입한다.
    2. 키가 존재하면 기존 값과 새로운 value를 remappingFunction으로 병합하여 새로운 값을 저장한다
Map<String, Integer> map = new HashMap<>();
map.put("apple", 2);

// 키 apple이 이미 존재하므로, 2와 3을 더해 새로운 값 5를 저장한다.
map.merge("apple", 3, Integer::sum);  

// 키 banana가 없으므로, 새로운 값 1을 그대로 삽입한다.
map.merge("banana", 1, Integer::sum);

System.out.println(map); // {apple=5, banana=1}

 

Compute

Map.compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)

  • 특정 키에 대해 값을 계산하여 저장하는 메서드이다.
  • 동작 방식은 다음과 같다.
    1. 키가 존재하면 remappingFunction에 (key, oldValue)를 전달한다.
    2. 키가 존재하지 않으면 remappingFunction에 (key, null)을 전달한다.
    3. 반환된 값이 null이면 해당 키를 맵에서 제거한다.
Map<String, Integer> map = new HashMap<>();
map.put("apple", 2);

// 기존 값(2)에 대해 연산을 수행하여 4로 갱신한다.
map.compute("apple", (k, v) -> v * 2);

// 키가 없는 경우 null로 들어오므로 기본값을 할당한다.
map.compute("banana", (k, v) -> v == null ? 1 : v + 1);

System.out.println(map); // {apple=4, banana=1}

 

PS 활용 예시(BOJ 7662. 이중 우선순위 큐)

이 문제 뿐만 아니라, Map을 사용하는 대부분의 문제에서 위 메서드를 사용하면 코드를 깔끔하게 작성할 수 있다.

Before

TreeMap<Integer, Integer> tree = new TreeMap<>();
int k = Integer.parseInt(br.readLine());

while (k-- > 0) {
    String[] parts = br.readLine().split(" ");
    if (parts[0].equals("I")) {
        int val = Integer.parseInt(parts[1]);
        int cur = tree.getOrDefault(val, 0);
        tree.put(val, cur + 1);
    } else if (tree.isEmpty()) {
        continue;
    } else {
        int key = 0;
        if (parts[1].equals("-1")) {
            key = tree.firstKey();
        } else {
            key = tree.lastKey();
        }
        int val = tree.get(key);
        if (val == 1) {
            tree.remove(key);
        } else {
            tree.put(key, val - 1);
        }
    }
}

After

while (t-- > 0) {
    TreeMap<Integer, Integer> tree = new TreeMap<>();
    int k = Integer.parseInt(br.readLine());

    while (k-- > 0) {
        String[] parts = br.readLine().split(" ");
        if (parts[0].equals("I")) {
            int val = Integer.parseInt(parts[1]);
            tree.merge(val, 1, Integer::sum);
        } else if (!tree.isEmpty()) {
            if (parts[1].equals("-1")) {
                tree.compute(tree.firstKey(), (k1, v) -> (v == 1) ? null : v - 1);
            } else {
                tree.compute(tree.lastKey(), (k1, v) -> (v == 1) ? null : v - 1);
            }
        }
    }
    if (tree.isEmpty()) {
        sb.append("EMPTY\n");
    } else {
        sb.append(tree.lastKey()).append(' ').append(tree.firstKey()).append('\n');
    }
}

 

코드가 매우 짧고 간결하게 정리된 것을 확인할 수 있다.

'Java > Modern Java(8~)' 카테고리의 다른 글

[Java] 68. 병렬 스트림  (0) 2025.07.04
[Java] 67. 디폴트 메서드  (0) 2025.07.04
[Java] 66. Optional  (0) 2025.07.04
[Java] 65. 스트림 API3 - 컬렉터  (0) 2025.07.04
[Java] 64. 스트림 API2 - 기능  (0) 2025.07.04
'Java/Modern Java(8~)' 카테고리의 다른 글
  • [Java] 68. 병렬 스트림
  • [Java] 67. 디폴트 메서드
  • [Java] 66. Optional
  • [Java] 65. 스트림 API3 - 컬렉터
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (463)
      • 개발 일지 (0)
        • Performance (0)
        • TroubleShooting (0)
        • Refactoring (0)
        • Code Style, Convetion (0)
        • Architecture (0)
      • Software Engineering (36)
        • Test (8)
        • 이론 (18)
        • Clean Code (10)
      • Java (72)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (13)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (16)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (130)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (6)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[Java 8+] Map과 merge(), compute()
상단으로

티스토리툴바