Skip to main content
 首页 » 编程设计

java删除list中所有null值

2022年07月19日182dyllove98

java删除list中所有null值

本文介绍如何删除list中所有null值,分别通过普通java方式,Guava,Apache Commons Collections以及java8 lambda表达式方式实现。

普通java方式

java Collection 框架提供简单解决方案,通过基本的while循环实现:

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

remove方法当参数为null时,背后也是for循环,删除null 返回true,继续外层循环,直至全部null被删除。当然我们也可以使用removeAll方法:

@Test 
public void givenListContainsNulls_whenRemovingNullsWithPlainJavaAlternative_thenCorrect() { 
    List<Integer> list = Lists.newArrayList(null, 1, null); 
    list.removeAll(Collections.singleton(null)); 
 
    assertThat(list, hasSize(1)); 
}

需要指出的是这两种方式都影响原list。

Guava方式

也可以通过Google Guava提供更实用的方法,使用predicte:

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

另外,如果我们不想修改原list,可以创建一个新list:

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

Apache Commons Collections方式

Apache Commons Collections提供了简单的方式实现,使用类似函数式编程方式:

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

这种方式也修改原list。

Java 8 Lambdas 方式

最后,我们看看java 8 lambda表达式解决方案,过滤list,且过滤过程可以是并行或串行:

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

好了,java8 提供的方式灵活好用。

总结

我们展示不同的方式去删除list中null值,快速且有用的解决方案,希望你喜欢。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/79782286
阅读延展