2011-12-04 26 views
26

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

tôi phải phát điên, bởi vì nó có vẻ như phương pháp này là làm ngược lại những gì các tài liệu nhà nước:

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 nhỏ này kiểm tra

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

Lỗi với

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

và in

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

Từ đọc sách của tôi trong những tài liệu tôi nên mong đợi [bar, qux]. Tôi đã bỏ lỡ điều gì?

+0

Tôi đã cập nhật bài đăng của mình để phản ánh điều này vì ai đó đã nhắc tôi nhớ - nhưng Bộ sưu tập của Apache Commons 4.0 đã được phát hành vào tháng 11 năm 2013, với bản sửa lỗi cho vấn đề này. – birryree

Trả lời

34

Chỉnh sửa ngày 1 tháng 1 năm 2014 Bộ sưu tập Apache Commons 4.0 cuối cùng đã được phát hành vào ngày 21 tháng 11 năm 2013 và chứa bản sửa lỗi cho vấn đề này.

Link to CollectionUtils.java

dòng trong câu hỏi (1688-1691), với sự thừa nhận phương pháp này trước đây đã bị hỏng:

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

gốc trả lời

Không, bạn không khùng. removeAll() thực sự (không chính xác) gọi retainAll().

Đây là lỗi trong CollectionUtils, ảnh hưởng đến phiên bản 3.2. Nó đã được sửa, nhưng chỉ trong nhánh 4.0.

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

Và làm bằng chứng hơn nữa, đây là một liên kết đến mã nguồn:

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

Kiểm tra dòng này:

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

Yep ... bị phá vỡ!

+1

Hút thuốc lá! Làm thế nào mà trượt qua các vết nứt? Cảm ơn bạn về thông tin. Upvote và chấp nhận cho bạn. – markdsievers

+0

@markdsievers - Có vẻ như cần kiểm tra đơn vị hoặc cần sửa chữa! – birryree

+0

IMO, điều này khá kém. Sai lầm là OK, nhưng vấn đề ban đầu có một con dấu sáng tạo của "02/Aug/06 17:37", và họ STILL đã không thực hiện một bản phát hành sản xuất với các sửa chữa trong đó. –

Các vấn đề liên quan