Me estoy preparando para un examen OCPJP 8 para los próximos 2 meses y actualmente este me llamó la atención porque no entiendo por qué.
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); } }¡esto claramente va a compilar OK! pero cuando lo ejecute verá la excepción como esta
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)Necesito ayuda aquí para entender por qué el método asList no funciona con removeIf. Supongo que devolverá una instancia de ArrayList que implementa el método removeIf.
Cualquier respuesta será apreciada.
¡salud!
ACTUALIZACIÓN: 16 de abril de 2022 El error ya no ocurre, incluso si usa java.util.Arrays.asList, lo que noto es que
java.util.Arrays.asList() produce una lista de la que es imposible eliminar elementos, por lo que genera un intento de eliminación.
Podrías envolverlo con ArrayList :
List<Integer> ints = new java.util.ArrayList<>(java.util.Arrays.asList(1,20,20)); Arrays.asList() devuelve return new ArrayList<>(a); donde ArrayList no es java.util.ArrayList , sino java.util.Arrays.ArrayList (clase interna), que no permite la eliminación.