【Java必修課】四類方法刪除List裏面的全部null值

1 簡介

萬惡的null已經摺磨程序員許久了,也帶來了許多難以發現卻形成嚴重損失的NullPointerException。咱們須要儘量的避免它,有一種簡單的辦法就是在它進入下輪處理前,咱們就把它扼殺在搖籃裏。java

本文介紹了四類方法,分別是List接口的方法、StreamGuavaApache Commons Collections來刪除一個List裏面的null值。但願讀者能夠觸類旁通,獲得更多啓發。程序員

2 四類方法

2.1 List自帶的方法

List有許多remove的方法可使用,如下三個均可以知足咱們的需求:apache

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

代碼以下:code

@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類進行處理,代碼以下:rem

@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,另外一種則不會。io

2.4 使用Apache Commons的庫

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

@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的方法,但稍加修改,就能夠擴展到集合類刪除特定條件的值,這仍是很是有用的。stream


歡迎關注公衆號<南瓜慢說>,將持續爲你更新...擴展

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

相關文章
相關標籤/搜索