我一直在寻找一些优雅的解决方案,以从列表中删除空值。我碰到了following post,说我可以使用list.removeAll(Collections.singletonList(null));
但是,这引发了UnsupportedOperationException,我认为这是因为removeAll()试图在不可变的单例集合上执行某些可变的操作。这样对吗?

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

提前致谢。

最佳答案

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

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]例如在scala中,可变和不可变的集合有一个单独的层次结构,API可以选择是否接受这个或另一个(或两者都接受,因为它们具有通用的基本接口(interface))

09-25 22:18