Javaのリストから全てのNULLを取り除く

JavaのリストからすべてのNullを削除する

このクイックチュートリアルでは、プレーンJava、Guava、Apache Commons Collections、および新しいJava 8ラムダサポートを使用してremove all null elements from a List,する方法を示します。

この記事は、例としてここのthe “Java – Back to Basic” seriesの一部です。

1. プレーンJavaを使用してListからNullを削除する

Javaコレクションフレームワークは、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. Google Guavaを使用してListからヌルを削除する

述語を介して、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. Apache Commonsコレクションを使用してListからヌルを削除する

同様の機能スタイルを使用してApacheCommonsCollectionsライブラリを使用する簡単なソリューションを見てみましょう。

@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. Lambdas(Java 8)を使用してListからNullを削除する

最後に–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));
}

これで、リストからすべてのnull要素を取り除くための迅速で非常に便利なソリューションがいくつかあります。

5. 結論

この記事では、Java、Guava、またはLambdasを使用してListからnullを削除するために必要なさまざまなアプローチを検討することができました。

これらすべての例とスニペットの実装は、GitHub projectにあります。 これはMavenベースのプロジェクトであるため、インポートと実行が簡単である必要があります。