当前位置: 首页 > 面试题库 >

Java Commons集合removeAll

宋典
2023-03-14
问题内容

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]。我错过了什么?


问题答案:

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

是的…坏了!



 类似资料:
  • 我有一个包含以下内容的EXCEL CSV文件: 如您所见,标头有字符串,没有引用。 使用此代码: 此命令的输出: 是单元素图! 使用级联键“access_id;logicalgate” 为什么解析器缺少标头分离?

  • sdiff key1 key2...keyN 返回所有给定key的差集 sdiffstore dstkey key1...keyN 同sdiff,并同时保存差集到dstkey下

  • sunion key1 key2...keyN 返回所有给定key的并集 sunionstore dstkey key1...keyN 同sunion,并同时保存并集到dstkey下

  • sinter key1 key2...keyN 返回所有给定key的交集 sinterstore dstkey key1...keyN 同sinter,但是会同时将交集存到dstkey下

  • 问题内容: 我一直遇到这个问题: 我想让hibernate管理一个表示集合集合的表。例如: 地图地图 套装清单 清单地图 例如,我希望能够代表这一点: 作为一个表: 没有自定义的hibernate代码似乎是不可能的,我不介意。但是我希望有人对自定义代码的外观有所指导。 我应该扩展AbstractPersistentCollection吗? CompositeUserType? 可以管理多个表是否正

  • 简介 Illuminate\Support\Collection 类提供了一个更具可读性的、更便于处理数组数据的封装。具体例子看下面的代码。我们使用了 collect 函数从数组中创建新的集合实例,对其中的每个元素运行 strtoupper 函数之后再移除所有的空元素: $collection = collect(['taylor', 'abigail', null])->map(function

  • 集合 对于数组与哈希,倾向使用字面量语法来构建实例(除非你需要给构造器传递参数)。 # 差 arr = Array.new hash = Hash.new # 好 arr = [] hash = {} 当创建一组元素为单词(没有空格或特殊字符)的数组时,倾向使用 %w 而不是 []。此规则只适用于数组元素有两个或以上的时候。 # 差 STATES = ['draft', 'open', 'clos

  • 集合 Scala有一个非常通用,丰富,强大,可组合的集合库;集合是高阶的(high level)并暴露了一大套操作方法。很多集合的处理和转换可以被表达的简洁又可读,但不审慎地用它们的功能也会导致相反的结果。每个Scala程序员应该阅读 集合设计文档;通过它可以很好地洞察集合库,并了解设计动机。 总使用最简单的集合来满足你的需求 层级 集合库很大:除了精心设计的层级(Hierarchy)——根是 T