Как проверить не является ли полученная на вход коллекция неизменной
Мой метод получает на вход List и далее происходит его сортировка. При входных данных
List<Integer> input = Collections.nCopies(Integer.MAX_VALUE - 1, 0);
Возникает ошибка. Как проверить перед сортировкой не является ли коллекция ,данная на вход не изменяемой, или как еще можно избежать ошибки. Спасибо
Ответы (1 шт):
Метода для проверки, является ли список неизменяемым, не существует, так как существует несколько разновидностей неизменяемых списков, которые можно создать разными способами:
Collections.nCopiesCollections.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());
}