Java Commons Collections removeAll

CollectionUtils::removeAll() Commons Collections 3.2.1

我一定是疯了,因为看起来这种方法正在做与文档状态相反的事情:

从集合中删除 中删除 中的元素。也就是说,此方法返回一个集合,其中包含 c 中不在 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> 但 was:<1>

和印刷品

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

从我对文档的阅读中,我应该期待。我错过了什么?[bar, qux]


答案 1

编辑 2014年1月1日Apache Commons Collections 4.0 最终于 2013 年 11 月 21 日发布,其中包含了此问题的修复程序。

链接到 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()

这是 中的一个错误,影响 3.2 版。它已被修复,但仅在4.0分支中。CollectionUtils

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

是的。。。破碎!


答案 2