移除 Java 列表中的所有空值

这个快速教程将展示如何使用纯 Java、Guava、Apache Commons Collections 以及较新的 Java 8 Lambda 支持来移除 List 中的所有空元素。

1. 使用纯 Java 从列表中移除空值

Java 集合框架提供了一个简单的解决方案来移除 List 中的所有空元素------一个基本的 while 循环:

hljs-copy-wrapper 复制代码
@Test
public void givenListContainsNulls_whenRemovingNullsWithPlainJava_thenCorrect() {
    List<Integer> list = Lists.newArrayList(null, 1, null);
    while (list.remove(null));

    assertThat(list, hasSize(1));
}

此外,我们还可以使用以下简单方法:

hljs-copy-wrapper 复制代码
@Test
public void givenListContainsNulls_whenRemovingNullsWithPlainJavaAlternative_thenCorrect() {
    List<Integer> list = Lists.newArrayList(null, 1, null);
    list.removeAll(Collections.singleton(null));

    assertThat(list, hasSize(1));
}

请注意,这两种解决方案都会修改源列表。

2. 使用 Google Guava 从列表中移除空值

我们也可以使用 Guava 和更函数式的做法,通过谓词来移除空值:

hljs-copy-wrapper 复制代码
@Test
public void givenListContainsNulls_whenRemovingNullsWithGuavaV1_thenCorrect() {
    List<Integer> list = Lists.newArrayList(null, 1, null);
    Iterables.removeIf(list, Predicates.isNull());

    assertThat(list, hasSize(1));
}

如果不想修改源列表,Guava 将允许我们创建一个新的过滤列表:

hljs-copy-wrapper 复制代码
@Test
public void givenListContainsNulls_whenRemovingNullsWithGuavaV2_thenCorrect() {
    List<Integer> list = Lists.newArrayList(null, 1, null, 2, 3);
    List<Integer> listWithoutNulls = Lists.newArrayList(
      Iterables.filter(list, Predicates.notNull()));

    assertThat(listWithoutNulls, hasSize(3));
}

3. 使用 Apache Commons Collections 从列表中移除空值

现在我们来看一个使用 Apache Commons Collections 库的简单解决方案,采用类似的函数式风格:

hljs-copy-wrapper 复制代码
@Test
public void givenListContainsNulls_whenRemovingNullsWithCommonsCollections_thenCorrect() {
    List<Integer> list = Lists.newArrayList(null, 1, 2, null, 3, null);
    CollectionUtils.filter(list, PredicateUtils.notNullPredicate());

    assertThat(list, hasSize(3));
}

请注意,此解决方案也会修改原始列表。

4. 使用 Lambda 表达式从列表中移除空值(Java 8)

最后------让我们来看一个使用 Lambda 表达式过滤 List 的 Java 8 解决方案;这个过滤过程可以并行进行或串行进行:

hljs-copy-wrapper 复制代码
@Test
public void givenListContainsNulls_whenFilteringParallel_thenCorrect() {
    List<Integer> list = Lists.newArrayList(null, 1, 2, null, 3, null);
    List<Integer> listWithoutNulls = list.parallelStream()
      .filter(Objects::nonNull)
      .collect(Collectors.toList());
}


@Test
public void givenListContainsNulls_whenFilteringSerial_thenCorrect() {
    List<Integer> list = Lists.newArrayList(null, 1, 2, null, 3, null);
    List<Integer> listWithoutNulls = list.stream()
      .filter(Objects::nonNull)
      .collect(Collectors.toList());
}

public void givenListContainsNulls_whenRemovingNullsWithRemoveIf_thenCorrect() {
    List<Integer> listWithoutNulls = Lists.newArrayList(null, 1, 2, null, 3, null);
    listWithoutNulls.removeIf(Objects::isNull);

    assertThat(listWithoutNulls, hasSize(3));
}

就是这样------一些快速且非常实用的解决方案,用于清除 List 中的所有空值元素。

5. 结论

在本文中,我们探索了使用 Java、Guava 或 Lambda 表达式从 List 中移除空值的不同方法。

相关推荐
Wang's Blog3 分钟前
Java 项目实战:交友项目 - FastDFS 工作原理
java·大数据·交友
Wang's Blog5 分钟前
Java 项目实战:交友项目 - 保存访客记录
java·开发语言·交友
liangbo79 分钟前
Spring系列01:IoC 与 DI 到底解决了什么
java·spring
江湖中的阿龙13 分钟前
Oracle 紧急安全警报:Java 9.1 分漏洞 CVE-2026-91403,撤销对 eMudhra 风险证书的信任
java·安全·oracle
挖掘狂人19 分钟前
缓存和数据库的一致性,别停在 “延时双删”
java·后端·程序员
codigger25 分钟前
缓存和数据库的一致性,别停在 “延时双删”
java·后端·程序员·后端开发
Java后端的Ai之路29 分钟前
Java并发编程07-等待通知机制优化循环等待
java·数据库·python
Raas10036 分钟前
AI网关如何接入?MAI Gateway部署实操教程
java·开发语言·人工智能·gateway·ai网关·mai gateway·企业级产品
前端双越老师1 小时前
程序员 1v1 访谈系列第十一期:应届生别做开发
java·agent·ai编程
Captain1314_李祖团1 小时前
5. MLIR相关语法
java·前端·javascript