2011-12-04 6 views
26

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

devo andare pazzo, becuase sembra che questo metodo sta facendo l'inverso di ciò che la documentazione dello stato:

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.

Questo piccolo JUnit prova

@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()); 
} 

Non funziona con

java.lang.AssertionError: expected:<2> but was:<1>

e stampe

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

Dalla mia lettura dei documenti devo aspettarmi [bar, qux]. Cosa mi sono perso?

+0

Ho aggiornato il mio post per riflettere questo dato che qualcuno me lo ha ricordato, ma Apache Commons Collections 4.0 è stato rilasciato a novembre 2013, con una correzione per questo problema. – birryree

risposta

34

Modifica 1 gennaio 2014 Apache Commons Collections 4.0 è stato finalmente rilasciato il 21 novembre 2013 e contiene una correzione per questo problema.

Link to CollectionUtils.java

linee in questione (1688-1691), con avviso il metodo è stato precedentemente frantumati:

/* 
... 
* @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); 
} 

risposta iniziale

No, non sei pazza. removeAll() in realtà (in modo errato) chiama retainAll().

Questo è un bug in CollectionUtils, che interessa la versione 3.2. È stato risolto, ma solo nel ramo 4.0.

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

E come ulteriore prova, ecco un link al codice sorgente:

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

Partenza questa linea:

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

Yep ... rotto!

+1

Holy smokes! Come è scivolato attraverso le fessure? Grazie per le informazioni. Volare e accettare per te. – markdsievers

+0

@markdsievers - Sembra che siano necessari entrambi i test di unità o che debbano essere risolti! – birryree

+0

IMO, questo è piuttosto scarso. Gli errori sono OK, ma il problema originale ha il timbro di creazione di "02/Aug/06 17:37" e non hanno ancora rilasciato una versione di produzione con la correzione. –