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

问题描述 投票:0回答:1

我正在准备接下来 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);
    }
}

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

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实例!

任何答案将不胜感激。

干杯!

更新:2022 年 4 月 16 日 即使您使用 java.util.Arrays.asList,错误也不再发生,我注意到的是

  • 最新的java 1.8*实现不再使用内部ArrayList类,而是使用java.util包下的类。
  • List 接口现在也有默认实现。
java arraylist java-stream ocpjp
1个回答
60
投票

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
(内部类),不允许删除。

© www.soinside.com 2019 - 2024. All rights reserved.