Удаление всех нулей из списка в Java
Это краткое руководство покажет, как использоватьremove all null elements from a List, с использованием простой Java, Guava, коллекций Apache Commons и новой поддержки лямбда-выражения Java 8.
Эта статья является частьюthe “Java – Back to Basic” series здесь для примера.
1. Удаление нулей изList с помощью простой Java
Java Collections Framework предлагает простое решение дляremoving all null elements in the List – a basic while loop:
@Test
public void givenListContainsNulls_whenRemovingNullsWithPlainJava_thenCorrect() {
List list = Lists.newArrayList(null, 1, null);
while (list.remove(null));
assertThat(list, hasSize(1));
}
В качестве альтернативы мы также можем использовать следующий простой подход:
@Test
public void givenListContainsNulls_whenRemovingNullsWithPlainJavaAlternative_thenCorrect() {
List list = Lists.newArrayList(null, 1, null);
list.removeAll(Collections.singleton(null));
assertThat(list, hasSize(1));
}
Обратите внимание, что оба эти решения будут изменять список источников.
2. Удаление нулей изList с помощью Google Guava
Мы также можемremove nulls using Guava и более функциональный подход с помощью предикатов:
@Test
public void givenListContainsNulls_whenRemovingNullsWithGuavaV1_thenCorrect() {
List list = Lists.newArrayList(null, 1, null);
Iterables.removeIf(list, Predicates.isNull());
assertThat(list, hasSize(1));
}
В качестве альтернативыif we don’t want to modify the source list, Guava позволит нам создать новый список фильтров:
@Test
public void givenListContainsNulls_whenRemovingNullsWithGuavaV2_thenCorrect() {
List list = Lists.newArrayList(null, 1, null, 2, 3);
List listWithoutNulls = Lists.newArrayList(
Iterables.filter(list, Predicates.notNull()));
assertThat(listWithoutNulls, hasSize(3));
}
3. Удаление пустых значений изList с помощью коллекций Apache Commons
Давайте теперь посмотрим на простое решение с использованием библиотеки Apache Commons Collections с использованием аналогичного функционального стиля:
@Test
public void givenListContainsNulls_whenRemovingNullsWithCommonsCollections_thenCorrect() {
List list = Lists.newArrayList(null, 1, 2, null, 3, null);
CollectionUtils.filter(list, PredicateUtils.notNullPredicate());
assertThat(list, hasSize(3));
}
Обратите внимание, что это решение также будетmodify the original list.
4. Удаление нулей изList с помощью лямбда-выражений (Java 8)
Наконец, давайте посмотрим наa Java 8 solution using Lambdas to filter the List; процесс фильтрации может выполняться параллельно или последовательно:
@Test
public void givenListContainsNulls_whenFilteringParallel_thenCorrect() {
List list = Lists.newArrayList(null, 1, 2, null, 3, null);
List listWithoutNulls = list.parallelStream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
@Test
public void givenListContainsNulls_whenFilteringSerial_thenCorrect() {
List list = Lists.newArrayList(null, 1, 2, null, 3, null);
List listWithoutNulls = list.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
public void givenListContainsNulls_whenRemovingNullsWithRemoveIf_thenCorrect() {
List listWithoutNulls = Lists.newArrayList(null, 1, 2, null, 3, null);
listWithoutNulls.removeIf(Objects::isNull);
assertThat(listWithoutNulls, hasSize(3));
}
Вот и все - несколько быстрых и очень полезных решений для избавления от всех нулевых элементов из списка.
5. Заключение
В этой статье мы смогли изучить различные подходы, которые могут потребоваться для удаления нулей изListс помощью Java, Guava или Lambdas.
Реализацию всех этих примеров и фрагментов можно найти вGitHub project. Это проект на основе Maven, поэтому его легко импортировать и запускать.