2011-12-04 17 views
26

CollectionUtils::removeAll() Commons Collections 3.2.1Java Commons Colecciones removeAll

Me estoy volviendo loco, becuase parece que este método está haciendo lo contrario de lo que el estado docs:

Removes the elements in remove from collection. That is, this method returns a collection containing all the elements in c that are not in remove.

Este pequeño JUnit prueba

@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> but was:<1>

y grabados

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

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

+0

Actualicé mi publicación para reflejar esto porque alguien me lo recordó, pero Apache Commons Collections 4.0 fue lanzado en noviembre de 2013, con una solución para este problema. – birryree

Respuesta

34

Edit 1 de enero de 2014 Apache Commons Collections 4.0 fue finalmente lanzado el 21 de noviembre de 2013, y contiene una solución para este problema.

Link to CollectionUtils.java

líneas en cuestión (1688-1691), con acuse estaba roto previamente el método:

/* 
... 
* @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 loca. removeAll() está (incorrectamente) llamando al retainAll().

Esto 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

Salida esta línea:

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

Sí ... roto!

+1

Holy smokes! ¿Cómo se deslizó eso a través de las grietas? Gracias por la info. Votar y aceptar por ti. – markdsievers

+0

@markdsievers - ¡Parece que se necesitan pruebas unitarias o que es necesario repararlas! – birryree

+0

IMO, esto es bastante pobre. Los errores están bien, pero el problema original tiene un sello de creación de "02/Aug/06 17:37", y TODAVÍA no han hecho una versión de producción con la corrección. –

Cuestiones relacionadas