java.util.Arrays.asList与removeIf一起使用时抛出UnsupportedOperationException
我准备接下来的2个月进行OCPJP 8考试,目前我已经引起了我的注意,因为我不明白为什么
public class BiPredicateTest { public static void main(String[] args) { BiPredicate<List, Integer> containsInt = List::contains; List 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> listInt = BiPredicateTest::consumeMe; listInt.accept(ints, 15); } public static void consumeMe(List ints, int num) { ints.removeIf(i -> i>num); ints.forEach(System.out::println); } }
这显然是编译好的! 但是当你运行它时,你会看到这样的exception
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实例。
任何答案将不胜感激。
干杯!
java.util.Arrays.asList()
生成一个列表,从中无法删除元素,因此它会引发删除尝试。
你可以用ArrayList
包装它:
List 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
(内部类),它不允许删除。