32

CollectionUtils :: removeAll()Commons Collections 3.2.1

このメソッドはドキュメントの状態とは逆のことをしているように見えるので、私は夢中になっているに違いありません。

コレクションからremoveの要素を削除します。つまり、このメソッドは、removeに含まれていないcのすべての要素を含むコレクションを返します。

この小さな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]ます。私は何を逃しましたか?

4

1 に答える 1

44

編集 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()います。

これは のバグでCollectionUtils、バージョン 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);
}

うん…壊れた!

于 2011-12-04T01:46:38.147 に答える