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.
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:
Mira esta línea:
public static Collection removeAll(Collection collection, Collection remove) {
return ListUtils.retainAll(collection, remove);
}
Sí ... ¡roto!