Какая польза от singletonList?

Я искал какое-то элегантное решение для удаления нулевых значений из списка. Я наткнулся на следующий пост, в котором говорится, что я могу использовать list.removeAll(Collections.singletonList(null));

Это, однако, выдает UnsupportedOperationException, что, как я полагаю, связано с тем, что removeAll() пытается выполнить некоторую мутативную операцию с неизменяемой коллекцией синглтонов. Это правильно?

Если это так, что было бы типичным использованием этого singletonList? Представлять коллекцию размера 1, когда вы уверены, что не хотите ничего делать с коллекцией?

Заранее спасибо.

Ответ 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] например. в существует иерархия разделов для изменяемых и неизменные коллекции, и API может выбрать, принимает ли он это или другое (или оба, так как они имеют общие базовые интерфейсы).

Ответ 2

Был ли ваш список защищен с помощью

Collections.unmodifiableList(list)

Потому что, если вы защитили его и попытаетесь изменить его позже, вы получите эту ошибку.

Ответ 3

Чтобы ответить на ваш актуальный вопрос:

что было бы типичным использованием этого singletonList? Представлять коллекцию размера 1, когда вы уверены, что не хотите ничего делать с коллекцией?

Типичное использование - если у вас есть один элемент и вы хотите передать его методу, который принимает List, то есть

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

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

removeAll() - особый случай для этого.