util substringbefore stringutils org example commons java collections apache-commons-collection

java - substringbefore - stringutils maven



Colecciones de Java Commons removeAll (1)

CollectionUtils :: removeAll () Commons Collections 3.2.1

Debo volverme loco, porque parece que este método está haciendo lo contrario de lo que dicen los documentos:

Elimina los elementos en eliminar de la colección. Es decir, este método devuelve una colección que contiene todos los elementos en c que no están en eliminar.

Esta pequeña prueba JUnit

@Test public void testCommonsRemoveAll() throws Exception { String str1 = "foo"; String str2 = "bar"; String str3 = "qux"; List<String> collection = Arrays.asList(str1, str2, str3); System.out.println("collection: " + collection); List<String> remove = Arrays.asList(str1); System.out.println("remove: " + remove); Collection result = CollectionUtils.removeAll(collection, remove); System.out.println("result: " + result); assertEquals(2, result.size()); }

Está fallando con

java.lang.AssertionError: expected: <2> pero fue: <1>

e impresiones

collection: [foo, bar, qux] remove: [foo] result: [foo]

De mi lectura de los documentos, debería esperar [bar, qux] . ¿Qué me he perdido?


Editar 1 de enero de 2014 Apache Commons Collections 4.0 finalmente se lanzó el 21 de noviembre de 2013 y contiene una solución para este problema.

Enlace a CollectionUtils.java

Líneas en cuestión (1688 - 1691), con reconocimiento de que el método se había roto previamente:

/* ... * @since 4.0 (method existed in 3.2 but was completely broken) */ public static <E> Collection<E> removeAll(final Collection<E> collection, final Collection<?> remove) { return ListUtils.removeAll(collection, remove); }

Respuesta original

No, no estás loco. removeAll() es en realidad (incorrectamente) llamando a retainAll() .

Este es un error en CollectionUtils , que afecta a la versión 3.2. Se ha solucionado, pero solo en la rama 4.0.

https://issues.apache.org/jira/browse/COLLECTIONS-349

Y como una prueba más, aquí hay un enlace al código fuente:

http://svn.apache.org/repos/asf/commons/proper/collections/tags/COLLECTIONS_3_2/src/java/org/apache/commons/collections/CollectionUtils.java

Mira esta línea:

public static Collection removeAll(Collection collection, Collection remove) { return ListUtils.retainAll(collection, remove); }

Sí ... ¡roto!