Java - HashMap에서 key로 value 업데이트

HashMap에서 key로 value를 업데이트하는 방법을 소개합니다.

1. key에 대한 value 업데이트

아래와 같이 put(key, value)으로 이전에 등록된 key에 대한 value를 업데이트할 수 있습니다. key가 HashMap에 존재하지 않는 경우, HashMap에 key와 value가 추가됩니다.

import java.util.HashMap;
import java.util.Map;

public class UpdateValueOfHashMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("melon", 2);
        map.put("kiwi", 3);

        // update
        map.put("melon", 10);

        System.out.println("Result: " + map);
    }
}

Output:

Result: {apple=1, kiwi=3, melon=10}

2. key에 대한 value 증가시키기

value가 Integer type일 때, 일정 크기만큼 value를 증가시킬 수 있습니다.

아래 코드는 특정 key에 저장된 value에 20을 더하여 업데이트하는 예제입니다.

import java.util.HashMap;
import java.util.Map;

public class UpdateValueOfHashMap2 {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("melon", 2);
        map.put("kiwi", 3);

        map.put("melon", map.get("melon") + 20);

        System.out.println("Result: " + map);
    }
}

Output:

Result: {apple=1, kiwi=3, melon=22}

NullPointerException

하지만, 다음과 같이 만약 key에 대한 value가 존재하지 않는다면, get()은 null을 리턴하여 NullPointerException이 발생합니다.

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("melon", 2);
map.put("kiwi", 3);

map.put("banana", map.get("banana") + 20);

Output

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because the return value of "java.util.Map.get(Object)" is null
	at UpdateValueOfHashMap2.main(UpdateValueOfHashMap2.java:14)

3. key가 존재할 때만 value 증가시키기

containsKey(key)삼항연산자를 이용하여 key가 존재하는 경우만 value를 증가시킬 수 있습니다. 이렇게 구현하면 NullPointerException을 피할 수 있습니다.

아래 코드는 key가 존재하면 20을 증가시키고, 그렇지 않으면 1로 설정하는 예제입니다.

import java.util.HashMap;
import java.util.Map;

public class UpdateValueOfHashMap2_1 {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("melon", 2);
        map.put("kiwi", 3);

        map.put("apple", map.containsKey("apple") ? map.get("apple") + 20 : 1);
        map.put("banana", map.containsKey("banana") ? map.get("banana") + 20 : 1);

        System.out.println("Result: " + map);
    }
}

Output:

Result: {banana=1, apple=21, kiwi=3, melon=2}

4. compute()

compute()를 이용하여 key가 존재하는 경우만 value 증가시키도록 구현할 수 있습니다.

compute()는 아래와 같이 BiFunction을 인자로 받으며, 위의 예제보다 더 간단한 코드로 구현할 수 있습니다.

import java.util.HashMap;
import java.util.Map;

public class UpdateValueOfHashMap4 {

    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("melon", 2);
        map.put("kiwi", 3);

        map.compute("apple", (k, v) -> (v == null) ? 1 : v + 20);
        map.compute("banana", (k, v) -> (v == null) ? 1 : v + 1);

        System.out.println("Result: " + map);
    }
}

Output:

Result: {banana=1, apple=21, kiwi=3, melon=2}

5. getOrDefault()

getOrDefault(key, default)는 key에 대한 value를 리턴하며, key가 존재하지 않으면 default를 리턴합니다. getOrDefault()를 사용하면 NullPointerException은 발생하지 않게 됩니다.

import java.util.HashMap;
import java.util.Map;

public class UpdateValueOfHashMap3 {

    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("melon", 2);
        map.put("kiwi", 3);

        map.put("melon", map.getOrDefault("melon", 0) + 10);
        map.put("banana", map.getOrDefault("banana", 0) + 10);

        System.out.println("Result: " + map);
    }
}

Output:

Result: {banana=10, apple=1, kiwi=3, melon=12}
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha