Java:为啥 Collection.addAll 不能接受 Iterables?

Posted

技术标签:

【中文标题】Java:为啥 Collection.addAll 不能接受 Iterables?【英文标题】:Java: why does Collection.addAll can not accept Iterables?Java:为什么 Collection.addAll 不能接受 Iterables? 【发布时间】:2011-04-19 10:11:23 【问题描述】:

我想知道为什么Collection.addAll() 方法只接受其他Collections 而不是Iterables。这是为什么呢?

对于Iterables 有类似的方法吗?

【问题讨论】:

如果您正在寻找最简单的方法来将迭代器添加到没有显式循环的集合中,您可以使用yourCollection.addAll(org.apache.commons.collections.IteratorUtils.toList(yourIterable.iterator())) 如果您的 Iterable 是一个数组,请使用 java.util.Arrays.asList() 数组不实现Iterable @SteveKuo:你能详细说明这个问题的含义吗? 【参考方案1】:

大概是因为Collection 接口是在 Java 1.2 中引入的,而 Iterable 只出现在 1.5 中,更改接口会破坏所有现有实现。

【讨论】:

这并不能解释为什么后来没有添加该方法。 @user48956:是的,确实如此:“更改接口会破坏所有现有实现”。尽管随着 Java 8 中默认方法的引入,这实际上变得不真实。 @user48956:不知道你为什么认为这是相关的。不是。 因为在添加 Iterable 时可以将 addAll(Iterable) 添加到 addAll(Collection) 中。是不是有什么原因没有添加? 这并不能解释为什么它没有被添加为 Java 8 中的默认方法。我倾向于 @OscarRyz's answer 它与代表有限元素集的 Collection 有关.【参考方案2】:

如有疑问,请务必检查 Guava(或 Commons):

番石榴:Iterables.addAll 公共收藏:CollectionUtils.addAll

【讨论】:

+1 表示 如果有疑问,请务必检查 Guava。大多数 apache commons 库都很棒,但是 commons / collections 很烦人,因为它不支持泛型。 它有一个支持泛型的分支:github.com/megamattron/collections-generic 链接断开。现在commons.apache.org/proper/commons-collections/javadocs/…【参考方案3】:

其他人已经广泛回答了“为什么”。

有任何类似的方法可以为 Iterables 做到这一点吗?

在 Java 8 中,您不再需要 addAll

Collection<X> coll = ...;
Iterable<X> it = ...;
it.forEach(coll::add); // coll.addAll(it);

【讨论】:

这正是我想要的。知道仅使用 JDK 就有可能。谢谢! 如果流是并行流,这是否有效?然后你会同时调用coll.add 有人对此做过一些基准测试吗?是不是比较快?【参考方案4】:

基本上是因为Iterable 可能永远不会结束(也就是说,hasNext() 永远返回 true)。

另外,为了保持一致性,您可能认为 Collection 可以添加另一个集合的所有元素,但是,Iterable 不一定是集合(它可以是任何东西,例如 ResultSet 包装器实例)。

【讨论】:

啊,你的第一点很好。我不太明白你所说的第二个是什么意思,以及它将如何影响addAll 方法。 至于第二个,iterable 是一个接口,几乎任何东西都可以实现它,你可能会遇到第一种情况,可能会出现无限循环。 不确定我是否同意。 Collection 可以像 Iterable 一样是无限的,因为您可以构造一个有效的 Collection 作为 Iterable 的包装器。 没关系,我检查了文档,download.oracle.com/javase/6/docs/api/java/util/… 它应该返回 Integer.MAX_VALUE @GaryF 我不认为集合应该是无限的集合,或者removeAll()retainAll() 可以无限期地执行。 @OscarRyz 仅仅因为大小可能大于 Integer.MAX_VALUE 并不意味着它可以是无限的。而且该接口甚至不能正确支持大于Integer.MAX_VALUE 的集合,因为toArray() 承诺返回所有元素,即使数组不能大于Integer.MAX_VALUE【参考方案5】:

核心 JDK 中有很多东西不能像普通的 Iterables 那样工作。我建议使用Guava 来克服很多这些缺点。

【讨论】:

您好,您能简要列出其中的一些缺点吗? @ctomek:这确实是 Guava 提供的内容的列表,最好通过点击链接并查看它提供的内容来显示...

以上是关于Java:为啥 Collection.addAll 不能接受 Iterables?的主要内容,如果未能解决你的问题,请参考以下文章

为啥Java中没有SortedList?

Java:无法加载属性文件。为啥?

Java:为啥需要包装类?

tomcat是啥,java为啥要用tomcat java有没有Socket 用tomcat有啥好处,为啥java程序要放到tomcat

为啥Java有瞬态字段?

为啥Java没有复制构造函数?