我一直在寻找一些优雅的解决方案,以从列表中删除空值。我碰到了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))