11

我正在寻找一些优雅的解决方案来从列表中删除空值。我遇到了以下帖子,上面说我可以使用 list.removeAll(Collections.singletonList(null));

然而,这会抛出一个UnsupportedOperationException,我假设这是因为removeAll()试图对不可变的单例集合进行一些变异操作。它是否正确?

如果是这种情况, this 的典型用途是singletonList什么?当您确定不想对集合实际执行任何操作时,代表大小为 1 的集合?

提前致谢。

4

3 回答 3

17

它就像一个魅力:

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]

IndeedCollections.singletonList(null)是不可变的(不幸的是,它隐藏在 Java [1]list中),但是从您的变量中抛出了异常。显然它也是不可变的,如下例所示:

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

此代码抛出一个UnsupportedOperationException. 如您所见singletonList(),在这种情况下很有用。当客户端代码需要一个只读列表(它不会修改它)但您只想在其中传递一个元素时使用它。singletonList()是(线程)安全的(由于不变性),快速且紧凑。

[1]例如,在中,可变和不可变集合有一个单独的层次结构,API 可以选择是否接受这个或另一个(或两者,因为它们具有通用的基本接口)

于 2012-06-26T10:48:52.353 回答
1

您的列表是否受到保护

Collections.unmodifiableList(list)

因为如果您已保护它并稍后尝试修改它,您会收到该错误。

于 2012-06-26T10:51:01.290 回答
1

要回答您的实际问题:

这个 singletonList 的典型用途是什么?当您确定不想对集合实际执行任何操作时,代表大小为 1 的集合?

典型的用途是如果你有一个元素并想将它传递给一个接受 a 的方法List,即

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

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

removeAll()是一个特例。

于 2019-08-16T10:19:11.940 回答