萬惡的null
已經摺磨程序員許久了,也帶來了許多難以發現卻形成嚴重損失的NullPointerException
。咱們須要儘量的避免它,有一種簡單的辦法就是在它進入下輪處理前,咱們就把它扼殺在搖籃裏。java
本文介紹了四類方法,分別是List
接口的方法、Stream
、Guava
和Apache Commons Collections
來刪除一個List
裏面的null
值。但願讀者能夠觸類旁通,獲得更多啓發。程序員
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); }
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); }
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
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); }
雖然本文講的是List
刪除null
的方法,但稍加修改,就能夠擴展到集合類刪除特定條件的值,這仍是很是有用的。stream
歡迎關注公衆號<南瓜慢說>,將持續爲你更新...擴展
多讀書,多分享;多寫做,多整理。