这个快速教程将展示如何使用纯 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 中移除空值的不同方法。