Java 從一個 List 中刪除 null 元素

概述

本文章主要是爲了展示如何從一個 List 列表中刪除所有的 null 元素。

在本文中,我們使用了下面的幾個實現:

  • 純 Java
  • Guava
  • Apache Commons Collections
  • Java 8 提供的 lambda 表達式

使用純 Java 來將 List 中的 null 元素刪除

Java 中的 Collections 框架提供了一個簡單的解決方案:

基於使用 while 循環將 List 列表中的所有空元素進行刪除。

    @Test
    public void givenListContainsNulls_whenRemovingNullsWithPlainJava_thenCorrect() {
        final List<Integer> list = Lists.newArrayList(null, 1, null);
        while (list.remove(null));
        
        assertThat(list, hasSize(1));
    }

可選的,我們可以使用一個更加簡單的方法,使用 list 中使用 removeAll 的方法來將 null 刪除。

    @Test
    public void givenListContainsNulls_whenRemovingNullsWithPlainJavaAlternative_thenCorrect() {
        final List<Integer> list = Lists.newArrayList(null, 1, null);
        list.removeAll(Collections.singleton(null));

        assertThat(list, hasSize(1));
    }

需要注意的是,上面 2 個方法將會對輸入的 List 進行修改。

在刪除後得到的 list 是修改後的list

使用 Guava

我們還可以使用 Guava 的方法來進行 null 的查詢和處理,這個需要通過 Java 的 predicates。

    @Test
    public void givenListContainsNulls_whenRemovingNullsWithGuavaV1_thenCorrect() {
        final List<Integer> list = Lists.newArrayList(null, 1, null);
        Iterables.removeIf(list, Predicates.isNull());

        assertThat(list, hasSize(1));
    }

如上面使用的代碼,首先需要對 List 進行遍歷,Iterables。List 對 Guava 來說是 Iterables。

然後使用 Predicates.isNull() 來進行判讀。

如果爲 NULL 就刪除。

 

list-null-01

 

如果你不希望對輸入的 List 進行修改的話,你可以使用 Guava 提供的 Iterables.filter 方法來進行遍歷和處理。

如下面的代碼,只需要將 removeIf 換成 filter 就可以了。

@Test
        final List<Integer> list = Lists.newArrayList(null, 1, null, 2, 3);
        final List<Integer> listWithoutNulls = Lists.newArrayList(Iterables.filter(list, Predicates.notNull()));

        assertThat(listWithoutNulls, hasSize(3));
}

使用 Apache Commons Collections

Apache Commons Collections 的使用和 Guava 的使用是類似的。

雖然 Apache Commons Collections 使用了 filter 方法,但是需要注意的,上面的方法會對輸入的 List 進行修改。

    @Test
    public void givenListContainsNulls_whenRemovingNullsWithCommonsCollections_thenCorrect() {
        final List<Integer> list = Lists.newArrayList(null, 1, 2, null, 3, null);
        CollectionUtils.filter(list, PredicateUtils.notNullPredicate());

        assertThat(list, hasSize(3));
}

Java 8 Lambdas 表達式

Java 8 提供了 Lambdas 表達式來對 null 進行處理。

這個處理可以是並行的,也可以是序列進行的。

請查看下面的代碼:

    @Test
    public void givenListContainsNulls_whenFilteringParallel_thenCorrect() {
        final List<Integer> list = Lists.newArrayList(null, 1, 2, null, 3, null);
        final List<Integer> listWithoutNulls = list.parallelStream().filter(Objects::nonNull).collect(Collectors.toList());

        assertThat(listWithoutNulls, hasSize(3));
    }

    @Test
    public void givenListContainsNulls_whenFilteringSerial_thenCorrect() {
        final List<Integer> list = Lists.newArrayList(null, 1, 2, null, 3, null);
        final List<Integer> listWithoutNulls = list.stream().filter(Objects::nonNull).collect(Collectors.toList());

        assertThat(listWithoutNulls, hasSize(3));
    }

    @Test
    public void givenListContainsNulls_whenRemovingNullsWithRemoveIf_thenCorrect() {
        final List<Integer> listWithoutNulls = Lists.newArrayList(null, 1, 2, null, 3, null);
        listWithoutNulls.removeIf(Objects::isNull);

        assertThat(listWithoutNulls, hasSize(3));
    }

使用上面的方法能夠讓你比較快速的將 List 中的 null 元素進行刪除。

結論

在本文中,我們對 List 中的 Null 對象如何刪除進行了一些探討。

通過上面的一些方法能夠讓你在 Java 進行編程的時候快速刪除 List 中的 null 元素。

 

https://www.ossez.com/t/java-list-null/13940

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章