Удаление всех нулей из списка в Java

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