singletonList有什么用?

时间:2012-06-26 10:46:24

标签: java list collections

我正在寻找一些优雅的解决方案来从List中删除空值。我遇到了following post,其中说我可以使用list.removeAll(Collections.singletonList(null));

但是,这会抛出UnsupportedOperationException,我假设是因为removeAll()试图对不可变的singleton集合进行一些变异操作。这是对的吗?

如果是这种情况,这个singleList的典型用法是什么?要在您确定不想对集合实际执行任何操作时表示大小为1的集合?

提前致谢。

3 个答案:

答案 0 :(得分:15)

它就像一个魅力:

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] 例如在中,可变和不可变集合有一个separete层次结构,API可以选择是接受这个还是另一个(或两者都有,因为它们有共同的基接口)

答案 1 :(得分:1)

您的列表是否已使用Collections.unmodifiableList(list)进行保护?因为如果你已经保护它并稍后尝试修改它就会出现错误。

答案 2 :(得分:0)

回答您的实际问题:

  

此singletonList的典型用法是什么?当您确定不想实际对集合进行任何操作时,要表示大小为1的集合吗?

通常的用法是,如果您有一个元素并将其传递给接受List的方法,即

public void registerUsers(List<User> users) {...}

User currentUser = Login Manager.getCurrentUser();
registerUsers(Collections.singletonList(currentUser));

removeAll()是一种特殊情况。