Подтвердить что ты не робот

Java.util.Arrays.asList при использовании с removeIf throws UnsupportedOperationException

Я готовлюсь к экзамену OCPJP 8 в течение следующих 2 месяцев и в настоящее время я это получил мое внимание, поскольку я не понимаю, почему

public class BiPredicateTest {
    public static void main(String[] args) {
        BiPredicate<List<Integer>, Integer> containsInt = List::contains;
        List<Integer> ints = java.util.Arrays.asList(1,20,20);
        ints.add(1);
        ints.add(20);
        ints.add(20);
        System.out.println(containsInt.test(ints, 20));

        BiConsumer<List<Integer>, Integer> listInt = BiPredicateTest::consumeMe;
        listInt.accept(ints, 15);

    }

    public static void consumeMe(List<Integer> ints, int num) {
        ints.removeIf(i -> i>num);
        ints.forEach(System.out::println);
    }
}

это явно собирается скомпилировать ОК! но когда вы запустите его, вы увидите исключение, подобное этому

C:\Users\user\Documents>javac BiPredicateTest.java

C:\Users\user\Documents>java BiPredicateTest
true
Exception in thread "main" java.lang.UnsupportedOperationException
        at java.util.AbstractList.remove(AbstractList.java:161)
        at java.util.AbstractList$Itr.remove(AbstractList.java:374)
        at java.util.Collection.removeIf(Collection.java:415)
        at BiPredicateTest.consumeMe(BiPredicateTest.java:22)
        at BiPredicateTest.main(BiPredicateTest.java:17)

Мне нужна помощь здесь, чтобы понять, почему метод asList не работает с removeIf? Я предполагаю, что он вернет экземпляр ArrayList, который реализует метод removeIf!.

Любой ответ будет оценен.

ура!

4b9b3361

Ответ 1

java.util.Arrays.asList() создает список, из которого невозможно удалить элементы, поэтому он генерирует попытку удаления.

Вы могли бы обернуть это с ArrayList:

List<Integer> ints = new java.util.ArrayList<>(java.util.Arrays.asList(1,20,20));

Обновить

Arrays.asList() возвращает return new ArrayList<>(a); где ArrayList - это не java.util.ArrayList, а java.util.Arrays.ArrayList (внутренний класс), который не допускает удаления.