CollectionUtils :: removeAll()公用集合3.2.1
我一定要疯了,因为似乎此方法正在做与文档状态相反的操作:
从集合中移除remove中的元素。也就是说,此方法返回一个集合,其中包含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:预期:<2>,但之前是:<1>
和印刷品
collection: [foo, bar, qux] remove: [foo] result: [foo]
通过阅读文档,我应该期待[bar, qux]。我错过了什么?
[bar, qux]
编辑2014年1月1日, Apache Commons Collections 4.0终于在2013年11月21日发布,其中包含针对此问题的修复程序。
链接到 CollectionUtils.java
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()。
removeAll()
retainAll()
这是中的错误CollectionUtils,影响版本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); }
是的…坏了!