为什么不同的包中有Iterable <E>和Iterator <E>?

tsk*_*zzy 10 java iterator iterable

Iterable<E>是在,java.langIterator<E>java.util.这有充分的理由还是仅仅是一个糟糕设计的神器?

这似乎很奇怪,因为唯一Iterable<E>有益的是提供一个Iterator<E>.

编辑:一个潜在的原因是因为(then-)新引入的每个循环.我想我的问题是,它们是否相同?

for(Object o : collection)
    ...
vs
for( Iterator iter = collection.iterator(); iter.hasNext(); ) {
    o = iter.next();
    ...
Run Code Online (Sandbox Code Playgroud)

如果它们是,那么仍然无法解释为什么这两个类在不同的包中,因为编译器必须导入java.util才能使用该Iterator构造.

duf*_*ymo 9

部分原因是历史:IteratorJDK 1.2以来一直与我们合作,并Iterable附带JDK 1.5. Iterable进来了增强的for循环.

糟糕的设计?不,进化.没有全知的创造者.随着经验的学习,它们被整合到JDK中.

  • 这里的"经验教训"是什么?为什么`java.lang`适用于Collections API中的某些包,其成员基本上是在`java.util`中?我认为这根本不回答这个问题. (2认同)

Mar*_*ers 8

java.lang保留用于语言功能依赖的类. Iterable通过for-each循环直接提供语言级别支持但Iterator不支持.

  • HashMap以何种方式直接支持语言? (4认同)
  • @alpha:是的,我不确定你从那里来的地方.有一种语法特别依赖于"Iterable".据我所知,没有哪个依赖于"地图".至少,不是在Java 7之前. (2认同)

Jer*_*man 5

大多数集合都是实现的,Iterable因此您可以使用方便的for循环语法:

Iterable<T> someIterableThing;
for (T x : someIterableThing) { ... }
Run Code Online (Sandbox Code Playgroud)

我想这Iterablejava.lang因为它与这种语法密切相关,这是Java语言的一个特性.