Как это сделать?
Я попытался создать новый пустой список, а затем скопировать ему немодифицируемые элементы списка, но я получаю неподдерживаемую операцию.
Любая помощь приветствуется.
Как это сделать?
Я попытался создать новый пустой список, а затем скопировать ему немодифицируемые элементы списка, но я получаю неподдерживаемую операцию.
Любая помощь приветствуется.
Создаете ли вы пустой список с помощью Collections.emptyList()
? Если это так, это тоже немодифицируемый список, и это может быть источником вашей проблемы.
Создайте новый список, используя конструктор для реализации списка, например new ArrayList()
. Вы можете передать исходный список в конструктор или использовать метод addAll()
.
FWIW, google-collections это однострочный:
List<Foo> sorted = Ordering.natural().sortedCopy(unmodifiableList);
List unmodifiableList = Collections.unmodifiableList(list);
List newList = new ArrayList(unmodifiableList);
Collections.sort(newList);
Конструктор ArrayList
принимает существующий список, читает его элементы (без их модификации!) и добавляет их в новый список.
В Java 8 вы можете использовать API потоков. Например:
List<?> sortedList = unsortedList.stream().sorted().collect(Collectors.toList());
Он должен работать, как описано. Элементы в немодифицируемом Списке сами по себе не подлежат модификации. Конечно, вы не можете сортировать немодифицируемый Список, потому что его нужно переписать с помощью операций добавления и удаления, и это запрещено.
Угадайте, что ошибка находится где-то в другом месте, лучше всего будет показывать ваш код:)
Я отвечу на ваш второй вопрос:
Вы не можете добавить в свой список "taskListModifiable", потому что это "немодифицируемый" список, который в Java означает, что он неизменен. Неизменяемый/неизменный список или коллекция любого типа не могут быть напрямую изменены каким-либо образом - вы не можете добавлять к нему элементы, удалять из него элементы или изменять ссылки на существующие элементы.
Обратите внимание, что существующие элементы в списке/коллекции могут быть изменены, если они сами изменяемы, но ссылки на них из списка не могут быть изменены. То есть до тех пор, пока список не выйдет из сферы действия и не будет собран мусором, в немодифицируемом списке всегда будут те же ссылки.
Теперь, в вашем случае, Collections.emptyList() возвращает немодифицируемый список EMPTY. Это на самом деле всегда один и тот же экземпляр, поскольку он неизменен и всегда пуст. Вы не можете добавить к нему из-за правила, что неизменный список не может быть расширен (добавлен). Поскольку он пуст, в нем нет ничего, что можно изменить.
Я должен добавить, чтобы еще более ясно, что Collection.emptyList() не создает пустой список. Он просто возвращает ссылку на экземпляр списка singleton.