Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java Map에서 null 값을 기본값으로 바꾸는 방법

Java의 Map 컬렉션에 저장된 null 값을 특정 기본값으로 한 번에 대체하는 방법을 알아보겠습니다. 아래 예제는 스트림(Stream) API를 활용해 맵 내부의 모든 null 값을 손쉽게 치환하는 코드입니다.

예제 코드

import java.util.*;
import java.util.stream.*;

public class Demo{
    public static <T, K> Map<K, T> null_vals(Map<K, T> my_map, T def_val){
        my_map = my_map.entrySet().stream().map(entry -> {
            if (entry.getValue() == null)
                entry.setValue(def_val);
            return entry;
        })
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
        return my_map;
    }

    public static void main(String[] args){
        Map<Integer, Integer> my_map = new HashMap<>();
        my_map.put(1, null);
        my_map.put(2, 56);
        my_map.put(3, null);
        my_map.put(4, 99);

        int defaultValue = 0;
        System.out.println("null 값이 포함된 맵 : " + my_map);
        my_map = null_vals(my_map, defaultValue);
        System.out.println("null 값이 대체된 맵 : " + my_map);
    }
}

실행 결과

null 값이 포함된 맵 : {1=null, 2=56, 3=null, 4=99}
null 값이 대체된 맵 : {1=0, 2=56, 3=0, 4=99}

코드 동작 원리

Demo 클래스에는 null_vals라는 제네릭 정적 메서드가 정의되어 있습니다. 이 메서드는 맵의 모든 엔트리(entry)를 스트림으로 변환한 뒤, 각 엔트리의 값이 null인지 검사합니다. 값이 null이라면 메서드 호출 시 매개변수로 전달된 기본값(def_val)으로 교체합니다.

이후 Collectors.toMap()을 사용해 수정된 엔트리들을 다시 하나의 맵으로 수집(collect)하여 반환합니다. 덕분에 반복문으로 맵을 직접 순회하며 수정하는 복잡한 과정 없이도 null 값을 깔끔하게 처리할 수 있습니다.

main 함수에서는 HashMap 인스턴스를 생성하고 put() 메서드로 네 개의 요소를 추가합니다. 이때 키 1과 3에 해당하는 값은 의도적으로 null로 설정했습니다. 이후 null_vals() 함수를 호출하면 두 개의 null 값이 모두 기본값인 0으로 대체되는 것을 실행 결과에서 확인할 수 있습니다.

참고: getOrDefault()를 활용한 대안

전체 맵을 일괄 변환하는 것이 아니라, 값을 조회할 때만 null을 방지하고 싶다면 Java 8부터 제공되는 getOrDefault() 메서드를 사용하는 것이 더 간단합니다.

int value = my_map.getOrDefault(1, 0); // 키 1의 값이 null이면 0 반환

이처럼 상황에 따라 전체 맵을 한 번에 처리할지, 아니면 개별 조회 시점에 기본값을 지정할지 선택하여 사용하면 됩니다.