В этом кратком руководстве показано, как удалить все нулевые
элементы из списка
с
помощью простой Java, Guava, коллекций Apache Commons и более новой поддержки лямбда-выражений Java 8.
Эта статья является частью серии « Java — Back to Basic » здесь, на ForEach.
1. Удалите нули из списка
, используя обычную Java
Java Collections Framework предлагает простое решение для удаления всех нулевых элементов в списке
— базовый цикл 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
Мы также можем удалить нули с помощью Guava и более функционального подхода с помощью предикатов:
@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
Теперь давайте рассмотрим простое решение с использованием библиотеки 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));
}
Обратите внимание, что это решение также изменит исходный список .
4. Удаление нулей из списка
с помощью лямбда-выражений (Java 8)
Наконец — давайте посмотрим на решение Java 8, использующее Lambdas для фильтрации списка ; процесс фильтрации может выполняться параллельно или последовательно:
@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));
}
Вот и все — несколько быстрых и очень полезных решений для избавления от всех нулевых элементов из списка.
5. Вывод
В этой статье мы смогли изучить различные подходы, которые мы можем использовать для удаления нулей из списка
с использованием Java, Guava или Lambdas.
Реализацию всех этих примеров и сниппетов можно найти в проекте GitHub . Это проект на основе Maven, поэтому его легко импортировать и запускать.