このクイックチュートリアルでは、プレーンJava、Guava、Apache Commons Collections、および新しいJava 8ラムダサポートを使用して、リスト からすべてのnull要素を削除する方法を示します。

この記事は、ここBaeldungの「Java –BacktoBasic」シリーズの一部です。

1. プレーンJavaを使用してリストからヌルを削除する

Javaコレクションフレームワークは、リスト内のすべてのnull要素を削除するためのシンプルなソリューションを提供します–基本的な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. GoogleGuavaを使用してリストからヌルを削除する

また、述語を介して、Guavaおよびより機能的なアプローチを使用してnullを削除することもできます。

@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. ApacheCommonsCollectionsを使用してリストからヌルを削除する

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

@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)

最後に、Lambdasを使用してリストをフィルタリングする aJava8ソリューションを見てみましょう。 フィルタリングプロセスは、並列または直列で実行できます。

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

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

5. 結論

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

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