2011-12-04 75 views
26

CollectionUtils::removeAll() Commons Collections 3.2.1的Java Commons Collections中的removeAll

我必須要瘋了,監守好像這種方法是做什麼的文檔狀態反:

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.

這一點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()); 
} 

正在失敗

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

,並打印

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

從我,我應該想到[bar, qux]的文檔閱讀。我錯過了什麼?

+0

我更新了我的文章以反映這一點,因爲有人讓我想起了它 - 但Apache Commons Collections 4.0於2013年11月發佈,併爲此問題提供了修復。 – birryree

回答

34

編輯2014年1月1日 Apache Commons Collections 4.0終於在2013年11月21日發佈,並且包含此問題的修復。

Link to CollectionUtils.java

線有問題(1688年至1691年),以確認該方法之前被打破:

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

原來的答案

不,你不是瘋。 removeAll()實際上是(錯誤地)呼叫retainAll()

這是CollectionUtils中的一個bug,影響版本3.2。它已被修復,但僅限於4.0分支。

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

而且進一步證明,這裏是一個鏈接到源代碼:

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

退房這一行:

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

是的...碎了!

+1

神聖煙!它是如何穿過裂縫的?謝謝(你的)信息。 Upvote並接受你。 – markdsievers

+0

@markdsievers - 看起來像單元測試是需要的,或需要修復! – birryree

+0

海事組織,這是相當差。錯誤是可以的,但是最初的問題有一個「02/Aug/06 17:37」的創建標記,他們仍然沒有發佈修正版的產品。 –

相關問題