I am preparing for an OCPJP 8 exam for the next 2 months and currently I this one got my attention as I dont understand why
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);
}
}
this clearly is going to compile OK! but when you run it you will see the exception like this
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)
I need some help here to understand why the asList method is not working with removeIf? i assume it will return an instance of ArrayList which implements removeIf method!.
Any answer will be appreciated.
cheers!
UPDATE: April 16,2022 The error is not happening anymore even you use the java.util.Arrays.asList, what I notice is that
- the latest java 1.8* implementation is not using internal ArrayList class anymore but the class under java.util package.
- the List interface also has default implementation now.
ints.add(1)
throws anUnsupportedOperationException
, since elements cannot be added to the array-backed list created byjava.util.Arrays.asList
. The example as presented appears to be bad. I suspect the threeadd
lines aren't supposed to be there. – Boyett