2012-06-26 65 views
8

我正在尋找一些優雅的解決方案來從列表中刪除空值。我遇到了following post,它說我可以用list.removeAll(Collections.singletonList(null));singletonList有什麼用?

然而,這會拋出UnsupportedOperationException,這我假設是因爲removeAll()試圖做一成不變單身收集一些變化的操作。它是否正確?

如果是這種情況,那麼這個singleList的典型用法是什麼?如果您確定自己不想真正對收藏做任何事情,要代表1號收藏?

在此先感謝。

+0

您是如何聲明該列表的?使用Arrays.asList()?如果是這樣,那麼它將是不可變的 – Murugesh

回答

14

它的工作原理就像一個魅力:

List<String> list = new ArrayList<String>(); 
list.add("abc"); 
list.add(null); 
list.add("def"); 
list.removeAll(Collections.singletonList(null)); 
System.out.println(list); //[abc, def] 

事實上Collections.singletonList(null)是不變的(這是不幸的是隱藏在Java中[1]),但異常是從您的list變量拋出。顯然,這是不可改變的,以及像下面的例子中:

List<String> list = Arrays.asList("abc", null, "def"); 
list.removeAll(Collections.singletonList(null)); 

此代碼拋出UnsupportedOperationException。所以你可以看到singletonList()在這種情況下很有用。當客戶端代碼需要一個只讀列表(它不會修改它)時使用它,但你只想傳遞一個元素。 singletonList()是(線程)安全的(由於不變性),快速而緊湊。

[1] E.g.在中有一個用於可變和不可變集合的獨立層次結構,並且API可以選擇它是接受這個還是另一個(或者兩者,因爲它們具有公共基接口)

+0

這正是我想要的。我不知道'Arrays.asList()'返回一個不可變列表(儘管我記得讀過它是「由傳入它的數組支持的)」。這可以通過使用'ArrayList(Collection c)'的構造函數來解決:'' 'new ArrayList (Arrays.asList(someArray))。removeAll(Collections.singletonList(null))' – mmoore

0

您的列表是否已使用Collections.unmodifiableList(list) ?因爲如果你保護了它並在稍後嘗試修改它,你會得到這個錯誤。