与removeIf一起使用时,java.util.Arrays.asList抛出UnsupportedOperationException

mar*_*tiz 14 java arraylist stream ocpjp

我准备在接下来的2个月进行OCPJP 8考试,目前我这个考试得到了我的注意,因为我不明白为什么

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这显然是编译好的!但是当你运行它时,你会看到这样的异常

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)
Run Code Online (Sandbox Code Playgroud)

我需要一些帮助来理解为什么asList方法不能与removeIf一起使用?我假设它将返回一个实现removeIf方法!的ArrayList实例.

任何答案将不胜感激.

干杯!

Rom*_*kiy 25

java.util.Arrays.asList() 生成一个列表,从中无法删除元素,因此它会引发删除尝试.

你可以用ArrayList:

List<Integer> ints = new java.util.ArrayList<>(java.util.Arrays.asList(1,20,20));
Run Code Online (Sandbox Code Playgroud)

更新

Arrays.asList()返回不在return new ArrayList<>(a);哪里,但是(内部类),不允许删除.ArrayListjava.util.ArrayListjava.util.Arrays.ArrayList

  • `Arrays.asList()`返回的列表是**不是**不可修改的,它有一个固定的长度,所以你不能删除或添加项目,但你可以更改值! (5认同)