2012-06-26 718 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) ?因为如果你保护了它并在稍后尝试修改它,你会得到这个错误。