我正在寻找一些优雅的解决方案来从List中删除空值。我遇到了following post,其中说我可以使用list.removeAll(Collections.singletonList(null));
removeAll()
试图对不可变的singleton集合进行一些变异操作。这是对的吗?
如果是这种情况,这个singleList的典型用法是什么?要在您确定不想对集合实际执行任何操作时表示大小为1的集合?
提前致谢。
答案 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] 例如在scala中,可变和不可变集合有一个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()
是一种特殊情况。