Как проверить не является ли полученная на вход коллекция неизменной

Мой метод получает на вход List и далее происходит его сортировка. При входных данных

List<Integer> input = Collections.nCopies(Integer.MAX_VALUE - 1, 0);

Возникает ошибка. Как проверить перед сортировкой не является ли коллекция ,данная на вход не изменяемой, или как еще можно избежать ошибки. Спасибо


Ответы (1 шт):

Автор решения: Nowhere Man

Метода для проверки, является ли список неизменяемым, не существует, так как существует несколько разновидностей неизменяемых списков, которые можно создать разными способами:

  • Collections.nCopies
  • Collections.unmodifiableList()
  • Collections.singletonList()
  • Collections.emptyList()
  • List.of (Java 9+)
  • Stream::toList (Java 16+) Даже список, возвращаемый Arrays.asList частично неизменяемый, так как в нём нельзя изменять количество элементов (добавлять/удалять), но порядок элементов в нём (при той же сортировке) может изменяться, так как метод set не выбрасывает исключение.

Если очень нужно, чтобы не выбрасывалось UnsupportedOperationException при сортировке, можно реализовать собственный метод:

public static <T extends Comparable<? super T>> boolean trySort(List<T> list) {
    try {
        Collections.sort(list);
        return true;
    } catch (UnsupportedOperationException unsupex) {
        return false;
    }
}

Если очень нужно получить любой отсортированный список из некоторого исходного списка, можно создать изменяемую копию списка, отсортировать и вернуть её:

public static <T extends Comparable<? super T>> List<T> sorted(List<T> list) {
    List<T> result = new ArrayList<>(list);
    Collections.sort(result);
    return result;
}

Или же использовать Stream API:

public static <T extends Comparable<? super T>> List<T> sorted(List<T> list) {
    return list.stream().sorted().collect(Collectors.toList());
}
→ Ссылка