«В этом кратком руководстве показано, как удалить все нулевые элементы из списка, используя обычную Java, Guava, коллекции Apache Commons и более новую поддержку лямбда-выражений Java 8.

Эта статья является частью серии «Java — Back to Basic» здесь, на Baeldung.

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

В качестве альтернативы, если мы не хотим изменять исходный код list, 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 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));
}

Обратите внимание, что это решение также изменит исходный список.

4. Удаление пустых значений из списка с помощью Lambdas (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, поэтому его легко импортировать и запускать.