在Java中删除列表中的所有空值

评论 0 浏览 0 2014-06-11

这个快速教程将展示如何使用普通的Java、Guava、Apache Commons Collections和较新的Java 8 lambda支持,从List中移除所有的空元素。

这篇文章是the “Java –Back to Basic”系列的一部分

1.使用普通Java删除List中的空号

Java集合框架提供了一个简单的解决方案,即清除List中的所有空元素 – 一个基本的while 循环

@Test
public void givenListContainsNulls_whenRemovingNullsWithPlainJava_thenCorrect() {
    List<Integer> list = Lists.newArrayList(null, 1, null);
    while (list.remove(null));

    assertThat(list, hasSize(1));
}

另外,我们也可以使用以下简单的方法。

@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从List中删除空值

我们还可以使用 Guava 删除空值,以及一种更实用的方法,通过Predicates:

@Test
public void givenListContainsNulls_whenRemovingNullsWithGuavaV1_thenCorrect() {
    List<Integer> list = Lists.newArrayList(null, 1, null);
    Iterables.removeIf(list, Predicates.isNull());

    assertThat(list, hasSize(1));
}

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

@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集合删除List中的空值

现在让我们来看看使用Apache Commons集合库的一个简单解决方案,使用类似的功能风格。

@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.使用Lambdas从List中删除空值(Java 8)

最后 – 让我们看看使用Lambdas过滤List的Java 8解决方案;过滤过程可以以并行或串行的方式进行。

@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或Lambdas从List中移除空值。

所有这些例子和片段的实现都可以在GitHub项目中找到。这是一个基于Maven的项目,所以它应该很容易导入和运行。

最后更新2022-12-16
0 个评论