1 簡介 萬惡的 已經折磨程式員許久了,也帶來了許多難以發現卻造成嚴重損失的 。我們需要儘可能的避免它,有一種簡單的辦法就是在它進入下輪處理前,我們就把它扼殺在搖籃里。 本文介紹了四類方法,分別是 介面的方法、 、`Guava Apache Commons Collections List null ...
1 簡介
萬惡的null
已經折磨程式員許久了,也帶來了許多難以發現卻造成嚴重損失的NullPointerException
。我們需要儘可能的避免它,有一種簡單的辦法就是在它進入下輪處理前,我們就把它扼殺在搖籃里。
本文介紹了四類方法,分別是List
介面的方法、Stream
、Guava
和Apache 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
的方法,但稍加修改,就可以擴展到集合類刪除特定條件的值,這還是非常有用的。
歡迎關註公眾號<南瓜慢說>,將持續為你更新...
多讀書,多分享;多寫作,多整理。