1

您可以将集合添加到列表中,将其作为参数constructor(collection).addAll(Collection)方法提供。但是,Iterator/Iterable就够了。如果设计师想要遵循基本原则:在你发送的内容上保持自由,在你接受的内容上保持保守,他们应该接受List或者甚至更好,ArrayList所以没有人会发现这种方法有用。那么,为什么他们更喜欢在中间的某个地方停下来呢?

一个类似的问题“为什么有 Collection.list 用于枚举器,但没有用于 Iterable/Iterator”,一位知名人士回答说这是出于历史原因,可以通过 .addAll 解决。但是,我不明白addAll他/她在说什么。在这里,我问正是因为我发现它addAll不适用于 Iterable/Iterator。

4

4 回答 4

11

历史:addAll()在 Java 1.2 中添加,Iterable随 Java 5 一起提供。

开发 SDK 的人现在有以下选择:

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

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

  3. 什么都不做,这不会破坏任何代码,但会惹恼很多人。

由于“不要破坏现有代码”比“让人们开心”具有更高的优先级,这就是他们所做的。

于 2013-09-02T15:51:29.990 回答
2

Iterable接口直到 Java 5 (1.5) 才添加,并引入了增强for循环。addAll回到 1.2 中对 Collections API 的介绍。

似乎有一种addAll(Iterator i)方法是有意义的。我不知道为什么设计师选择不这样做。Guava 很乐意接受Iterators。

于 2013-09-02T15:49:16.860 回答
2

addAll加入的时候Collection没有Iterable接口,所以当时不能加入。它可以稍后添加,而是填充 Iterface,以及具有类似功能的实现,它没有被包括在内。

顺便说一句Iterable,JDK 中的所有内容都是集合。添加了AFAIKIterable以支持 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 中的流)
  • 您不希望单独使用 xxxAll(Iterator),因为这会使常见情况复杂化。
于 2013-09-02T15:50:26.193 回答
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 集合的提交者。

于 2013-09-03T01:40:09.960 回答