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