写点什么

Java 从一个 List 中删除 null 元素

作者:HoneyMoose
  • 2022 年 5 月 01 日
  • 本文字数:1804 字

    阅读完需:约 6 分钟

概述


本文章主要是为了展示如何从一个 List 列表中删除所有的 null 元素。


在本文中,我们使用了下面的几个实现:


纯 JavaGuavaApache Commons CollectionsJava 8 提供的 lambda 表达式使用纯 Java 来将 List 中的 null 元素删除


Java 中的 Collections 框架提供了一个简单的解决方案:


基于使用 while 循环将 List 列表中的所有空元素进行删除。


@Testpublic void givenListContainsNulls_whenRemovingNullsWithPlainJava_thenCorrect() {    final List<Integer> list = Lists.newArrayList(null, 1, null);    while (list.remove(null));        assertThat(list, hasSize(1));}
复制代码


可选的,我们可以使用一个更加简单的方法,使用 list 中使用 removeAll 的方法来将 null 删除。


@Testpublic void givenListContainsNulls_whenRemovingNullsWithPlainJavaAlternative_thenCorrect() {    final List<Integer> list = Lists.newArrayList(null, 1, null);    list.removeAll(Collections.singleton(null));
assertThat(list, hasSize(1));}
复制代码


需要注意的是,上面 2 个方法将会对输入的 List 进行修改。


在删除后得到的 list 是修改后的 list


使用 Guava


我们还可以使用 Guava 的方法来进行 null 的查询和处理,这个需要通过 Java 的 predicates。


@Testpublic void givenListContainsNulls_whenRemovingNullsWithGuavaV1_thenCorrect() {    final List<Integer> list = Lists.newArrayList(null, 1, null);    Iterables.removeIf(list, Predicates.isNull());
assertThat(list, hasSize(1));}
复制代码


如上面使用的代码,首先需要对 List 进行遍历,Iterables。List 对 Guava 来说是 Iterables。


然后使用 Predicates.isNull() 来进行判读。


如果为 NULL 就删除。


如果你不希望对输入的 List 进行修改的话,你可以使用 Guava 提供的 Iterables.filter 方法来进行遍历和处理。


如下面的代码,只需要将 removeIf 换成 filter 就可以了。


@Testfinal List<Integer> list = Lists.newArrayList(null, 1, null, 2, 3);final List<Integer> listWithoutNulls = Lists.newArrayList(Iterables.filter(list, Predicates.notNull()));


    assertThat(listWithoutNulls, hasSize(3));
复制代码


}


使用 Apache Commons Collections


Apache Commons Collections 的使用和 Guava 的使用是类似的。


虽然 Apache Commons Collections 使用了 filter 方法,但是需要注意的,上面的方法会对输入的 List 进行修改。


@Testpublic void givenListContainsNulls_whenRemovingNullsWithCommonsCollections_thenCorrect() {    final List<Integer> list = Lists.newArrayList(null, 1, 2, null, 3, null);    CollectionUtils.filter(list, PredicateUtils.notNullPredicate());
assertThat(list, hasSize(3));
复制代码


}


Java 8 Lambdas 表达式


Java 8 提供了 Lambdas 表达式来对 null 进行处理。


这个处理可以是并行的,也可以是序列进行的。


请查看下面的代码:


@Testpublic void givenListContainsNulls_whenFilteringParallel_thenCorrect() {    final List<Integer> list = Lists.newArrayList(null, 1, 2, null, 3, null);    final List<Integer> listWithoutNulls = list.parallelStream().filter(Objects::nonNull).collect(Collectors.toList());
assertThat(listWithoutNulls, hasSize(3));}
@Testpublic void givenListContainsNulls_whenFilteringSerial_thenCorrect() { final List<Integer> list = Lists.newArrayList(null, 1, 2, null, 3, null); final List<Integer> listWithoutNulls = list.stream().filter(Objects::nonNull).collect(Collectors.toList());
assertThat(listWithoutNulls, hasSize(3));}
@Testpublic void givenListContainsNulls_whenRemovingNullsWithRemoveIf_thenCorrect() { final List<Integer> listWithoutNulls = Lists.newArrayList(null, 1, 2, null, 3, null); listWithoutNulls.removeIf(Objects::isNull);
assertThat(listWithoutNulls, hasSize(3));}
复制代码


使用上面的方法能够让你比较快速的将 List 中的 null 元素进行删除。


结论


在本文中,我们对 List 中的 Null 对象如何删除进行了一些探讨。


通过上面的一些方法能够让你在 Java 进行编程的时候快速删除 List 中的 null 元素。


https://www.ossez.com/t/java-list-null/13940

用户头像

HoneyMoose

关注

还未添加个人签名 2021.03.06 加入

还未添加个人简介

评论

发布
暂无评论
Java 从一个 List 中删除 null 元素_HoneyMoose_InfoQ写作社区