【Java必修課】四類方法刪除List里面的所有null值


1 簡介

萬惡的null已經折磨程序員許久了,也帶來了許多難以發現卻造成嚴重損失的NullPointerException。我們需要盡可能的避免它,有一種簡單的辦法就是在它進入下輪處理前,我們就把它扼殺在搖籃里。

本文介紹了四類方法,分別是List接口的方法、StreamGuavaApache Commons Collections來刪除一個List里面的null值。希望讀者可以舉一反三,得到更多啟發。

2 四類方法

2.1 List自帶的方法

List有許多remove的方法可以使用,以下三個都可以滿足我們的需求:

  • List.remove(Object o):刪除一個元素,成功則返回true;需要注意它只刪除一個;
  • List.removeAll(Collection<?> c):刪除存在集合c的所有情況,注意入參不是一個元素;
  • List.removeIf(Predicate<? super E> filter):刪除所有滿足條件的元素,入參為Lambda表達式。

代碼如下:

@Test
public void listRemove() {
  List<String> list = Lists.newArrayList("Cup", null, "Apple", null, "Desk");
  List<String> expected = Lists.newArrayList("Cup", "Apple", "Desk");
  //remove
  while (list.remove(null));//巧妙利用循環刪除
  assertEquals(expected, list);
  //removeAll
  list = Lists.newArrayList("Cup", null, "Apple", null, "Desk");
  list.removeAll(Collections.singletonList(null));
  assertEquals(expected, list);
  //removeIf
  list = Lists.newArrayList("Cup", null, "Apple", null, "Desk");
  list.removeIf(Objects::isNull);
  assertEquals(expected, list);
}

2.2 Stream的方式

Stream的方法很容易理解,就是加一個過濾器即可,過濾條件為非空,具體代碼如下:

@Test
public void stream() {
  List<String> list = Lists.newArrayList("Cup", null, "Apple", null, "Desk");
  List<String> expected = Lists.newArrayList("Cup", "Apple", "Desk");
  List<String> result = list.parallelStream()
    .filter(Objects::nonNull)
    .collect(Collectors.toList());
  assertEquals(expected, result);
}

2.3 使用Guava庫

Guava是非常優秀的Java庫,提供了許多優秀的處理集合類的方法,本次使用了Iterables類進行處理,代碼如下:

@Test
public void guava() {
  //改變原有List
  List<String> list = Lists.newArrayList("Cup", null, "Apple", null, "Desk");
  List<String> expected = Lists.newArrayList("Cup", "Apple", "Desk");
  Iterables.removeIf(list, Objects::isNull);
  assertEquals(expected, list);
  //保留原有List
  list = Lists.newArrayList("Cup", null, "Apple", null, "Desk");
  List<String> result = Lists.newArrayList(Iterables.filter(list, Objects::nonNull));
  assertEquals(expected, result);
}

本文提供兩種方法,一種會改變原有的List,另一種則不會。

2.4 使用Apache Commons的庫

Apache Commons Collections也提供了很方便的方法,具體代碼如下:

@Test
public void apacheCommonsCollections() {
  List<String> list = Lists.newArrayList("Cup", null, "Apple", null, "Desk");
  List<String> expected = Lists.newArrayList("Cup", "Apple", "Desk");
  CollectionUtils.filter(list, Objects::nonNull);
  assertEquals(expected, list);
}

3 總結

雖然本文講的是List刪除null的方法,但稍加修改,就可以擴展到集合類刪除特定條件的值,這還是非常有用的。


歡迎關注公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM