Putting Value Into Map if Not Null in Java
1. 개요
이번 튜토리얼에서는 맵에 null 값을 삽입하는 것을 피하는 방법을 배워보겠습니다. 우리는 Map 인터페이스의 put() 메서드에 초점을 맞춰 새로운 키-값 쌍을 추가할 것입니다.
2. if 문 사용하기
예제로, 우리는 맵과 null String 변수를 가질 것입니다:
private final Map<Integer, String> map = new HashMap<>();
private final String value = null;
변수가 null이 아닐 때만 put() 메서드를 호출하여 맵에 null 값을 삽입하지 않도록 할 수 있습니다. 이는 if 문을 통해 구현할 수 있습니다:
@Test
void givenNullValue_whenUsingIfStatementWithPutMethod_thenObtainMapWithNonNullValues() {
if (value != null) {
map.put(1, value);
}
assertThat(map).isEmpty();
}
우리는 put() 메서드의 호출을 조건부 논리에 감싸서 맵에 null 값을 삽입하는 것을 피할 수 있었습니다.
3. Optional.ifPresent() 메서드 사용하기
대안으로, 우리는 Optional 클래스를 사용하여 조건적으로 put() 메서드를 호출할 수 있습니다:
@Test
void givenNullValue_whenUsingOptionalIfPresentWithPutMethod_thenObtainMapWithNonNullValues() {
Optional.ofNullable(value).ifPresent(nonNullValue -> map.put(1, nonNullValue));
assertThat(map).isEmpty();
}
먼저, ofNullable() 메서드를 사용하여 변수의 Optional을 얻습니다. 이 메서드는 값이 존재하면 값을 포함한 Optional을 반환하고, 값이 null이면 빈 Optional을 반환합니다.
다음으로, ifPresent() 메서드를 활용하여 Optional에 값이 있을 경우에만 put() 메서드를 조건적으로 호출합니다. 이 경우, 우리는 빈 Optional을 가지고 있으므로 put() 메서드는 호출되지 않아 맵이 null 값을 삽입당하는 것을 방지하게 됩니다.
4. Stream.filter() 메서드 사용하기
만약 우리가 잠재적으로 nullable 값의 소스로 컬렉션을 가지고 있다면, filter() 메서드를 사용하여 맵에 null 값을 삽입하는 것을 피할 수 있습니다. 가능한 시나리오는 기존 맵에서 새로운 맵을 만들고 싶지만 null 값이 없도록 하는 것입니다.
기존 맵에 null 값이 있는 키-값 쌍이 있는 경우, filter() 메서드를 사용할 수 있습니다:
@Test
void givenMapWithNullValue_whenUsingStreamFilter_thenObtainMapWithNonNullValues() {
final Map<Integer, String> nullValueMap = new HashMap<>();
nullValueMap.put(1, value);
final Map<Integer, String> mapWithoutNullValues = nullValueMap
.entrySet()
.stream()
.filter(entry -> Objects.nonNull(entry.getValue()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
assertThat(mapWithoutNullValues).isEmpty();
}
먼저, entrySet()에서 반환된 Set
그러나 우리는 같은 효과를 달성하기 위해 다른 조건을 사용할 수도 있습니다. 예를 들어, 람다 표현식의 일부분으로 if 문을 사용할 수 있습니다:
.filter(entry -> {
if(entry.getValue() != null)
return true;
else
return false;
})
또는 Optional 클래스의 isPresent() 메서드를 사용할 수도 있습니다:
.filter(entry -> Optional.ofNullable(entry.getValue()).isPresent())
어쨌든, 우리는 필터링된 요소를 새로운 맵으로 수집하여 null 값이 없도록 합니다.
5. 결론
이 기사에서는 put() 메서드를 사용하여 맵에 null 값을 삽입하지 않는 여러 가지 방법을 탐구했습니다. 맵이 null 값을 절대 가질 수 없도록 하려면, 맵에 키-값을 삽입하는 다른 방법도 고려해야 합니다. 예를 들어, 구체적인 Map 클래스의 생성자와 putAll()과 같은 메서드를 사용하는 것입니다.
항상 그랬듯이, 이 기사에서 사용된 코드 샘플은 GitHub에서 확인할 수 있습니다.