1. 概述

本文将探讨几种避免向Map中插入null值的方法。我们将重点使用Map接口的put()方法来添加新的键值对,并确保在值为null时跳过插入操作。

2. 使用if语句判断

我们先准备一个Map和一个可能为null的String变量作为示例:

private final Map<Integer, String> map = new HashMap<>();
private final String value = null;

最直接的方法:通过if语句判断值非null时才调用put()方法:

@Test
void givenNullValue_whenUsingIfStatementWithPutMethod_thenObtainMapWithNonNullValues() {
    if (value != null) {
        map.put(1, value);
    }
    assertThat(map).isEmpty();
}

效果:当value为null时,put()方法不会被调用,Map保持空状态。这种方式简单粗暴,但完全有效。

3. 使用Optional.ifPresent()方法

⚠️ 函数式方案:利用Optional类优雅地处理null值:

@Test
void givenNullValue_whenUsingOptionalIfPresentWithPutMethod_thenObtainMapWithNonNullValues() {
    Optional.ofNullable(value).ifPresent(nonNullValue-> map.put(1, nonNullValue));
    assertThat(map).isEmpty();
}

实现原理

  1. 通过Optional.ofNullable()将变量包装为Optional
  2. 当Optional为空(即value为null)时,ifPresent()不会执行传入的操作
  3. 当Optional有值时,才会执行put()操作

优势:代码更简洁,避免显式null检查,符合函数式编程风格。

4. 使用Stream.filter()方法

💡 批量处理场景:当需要从现有Map过滤null值时,Stream API是最佳选择:

@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();
}

关键步骤

  1. 将Map转换为Entry流
  2. 使用filter()配合Objects.nonNull()过滤掉值为null的条目
  3. 通过Collectors.toMap()重新收集为Map

替代方案:以下谓词(predicate)也能达到相同效果:

// 方案1:lambda表达式显式判断
.filter(entry -> {
    if(entry.getValue() != null)
        return true;
    else 
        return false;
})

// 方案2:Optional.isPresent()
.filter(entry -> Optional.ofNullable(entry.getValue()).isPresent())

适用场景:处理已存在Map的null值清理,或从集合批量构建新Map时。

5. 总结

本文介绍了三种避免向Map插入null值的方法:

  1. if语句:简单直接,适用于单次插入场景
  2. **Optional.ifPresent()**:函数式风格,代码更优雅
  3. **Stream.filter()**:适合批量处理和集合转换

⚠️ 注意事项:要完全确保Map不包含null值,还需考虑其他插入方式:

  • Map构造器(如new HashMap<>(existingMap)
  • putAll()方法
  • merge()等方法

根据具体场景选择最适合的方案,才能有效避免null值带来的潜在问题。


原始标题:Putting Value Into Map if Not Null in Java | Baeldung