web-dev-qa-db-ja.com

java.util.Arrays.asListをremoveIfとともに使用すると、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);
    }
}

これは明らかにOKです。しかし、実行すると、このような例外が表示されます

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で機能しない理由を理解するには、ここに助けが必要ですか? removeIfメソッドを実装するArrayListのインスタンスを返すと思います!.

どんな答えでもいただければ幸いです。

乾杯!

16
mark ortiz

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_(内部クラス)なので、削除できません。

23