为什么我们addAll(Collection)但不是Iterable?

时间:2013-09-02 15:45:06

标签: java collections arraylist

您可以添加要列出的集合,将其作为constructor(collection).addAll(Collection)方法的参数提供。但是,Iterator/Iterable就足够了。如果设计师想要关注fundamental principle: be liberal in what you send and be conservative in what you accept,那么他们应该接受List或者更好的ArrayList,所以没有人会发现这种方法有用。那么,为什么他们宁愿在中间的某个地方停下来?

a similar question "why is there Collection.list for enumerator but not for Iterable/Iterator"highly reputable person answers that this is for historical reasons, which can be worked around through .addAll。但是,我不明白他/她在谈论哪个addAll。 在这里,我确切地问,因为我发现addAll不适用于Iterable / Iterator。

4 个答案:

答案 0 :(得分:11)

历史记录:在Java 1.2中添加了addAll(),在Java 5中添加了Iterable

执行SDK的人现在拥有以下选项:

  1. 替换现有的API(可能会破坏大量代码)或

  2. 添加第二个addAll(Iterable)可能会破坏大量代码。

  3. 什么都不做,这不会破坏任何代码,但会让很多人感到厌烦。

  4. 由于“不破坏现有代码”的优先级高于“让人快乐”,这就是他们所做的。

答案 1 :(得分:2)

在Java 5(1.5)之前添加Iterable接口,并引入了增强的for循环。 addAll可以追溯到1.2中的Collections API的介绍。

似乎有一个addAll(Iterator i)方法是有道理的;我不知道为什么设计师选择不这样做。番石榴很高兴接受Iterator s。

答案 2 :(得分:2)

addAll添加到Collection时,没有Iterable接口,因此当时无法添加。它本来可以在以后添加,而是填满Iterface,并且具有类似功能的实现,它不包括在内。

BTW JDK中的所有Iterable都是集合。 添加了AFAIK Iterable以支持for-each循环。

你可能已经拥有Java 1.2

public void addAll(Collection);
public void addAll(Iterator);
public void removeAll(Collection);
public void removeAll(Iterator);
public void retainAll(Collection);
public void retainAll(Iterator);

但你会有

  • 添加了改变其参数的方法。 addAll(Collection)不会改变集合。
  • 将执行类似事情的方法数量增加一倍,而这些方法本来就令人困惑。例如。他们删除了无符号基元以最小化类似结构的数量选项
  • 操纵迭代器不被认为是自然的(参见Java 8中的Streams)
  • 您不会单独使用xxxAll(Iterator),因为这会使常见情况复杂化。

答案 3 :(得分:2)

Eclipse Collections中的可变容器的方法为addAllIterable(Iterable)

MutableList<Integer> list = FastList.newListWith(1, 2, 3);
Iterable<Integer> iterable = FastList.newListWith(4, 5, 6);
list.addAllIterable(iterable);
Assert.assertEquals(FastList.newListWith(1, 2, 3, 4, 5, 6), list);

注意:我是Eclipse集合的提交者。