您可以添加要列出的集合,将其作为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。
答案 0 :(得分:11)
历史记录:在Java 1.2中添加了addAll()
,在Java 5中添加了Iterable
。
执行SDK的人现在拥有以下选项:
替换现有的API(可能会破坏大量代码)或
添加第二个addAll(Iterable)
可能会破坏大量代码。
什么都不做,这不会破坏任何代码,但会让很多人感到厌烦。
由于“不破坏现有代码”的优先级高于“让人快乐”,这就是他们所做的。
答案 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);
但你会有
答案 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集合的提交者。