猿问
下载APP

为什么Java的Iterator不可迭代?

为什么Iterator接口不扩展Iterable?


该iterator()方法可以简单地返回this。


是故意的还是对Java设计人员的监督?


能够将for-each循环与迭代器一起使用会很方便:


for(Object o : someContainer.listSomeObjects()) {

    ....

}

其中listSomeObjects()返回迭代器。


MMMHUHU
浏览 57回答 3
3回答

喵喵时光机

因为迭代器通常指向集合中的单个实例。Iterable意味着可以从一个对象获得迭代器以遍历其元素-无需迭代单个实例(迭代器代表的是该实例)。

慕侠2389804

迭代器是有状态的。这个想法是,如果您调用Iterable.iterator()两次,您将获得独立的迭代器-无论如何对于大多数可迭代对象。在您的方案中显然不是这种情况。例如,我通常可以写:public void iterateOver(Iterable<String> strings){&nbsp; &nbsp; for (String x : strings)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(x);&nbsp; &nbsp; }&nbsp; &nbsp; for (String x : strings)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(x);&nbsp; &nbsp; }}这应该将集合打印两次-但是使用您的方案,第二个循环将始终立即终止。

largeQ

对于我的$ 0.02,我完全同意Iterator不应该实现Iterable,但是我认为Enhanced for循环应该接受其中任何一个。我认为整个“使迭代器可迭代”的论点是作为一种解决语言缺陷的方法而提出的。引入增强的for循环的全部原因是,它“消除了对集合和数组进行迭代时迭代器和索引变量的繁琐和易错性” [ 1 ]。Collection<Item> items...for (Iterator<Item> iter = items.iterator(); iter.hasNext(); ) {&nbsp; &nbsp; Item item = iter.next();&nbsp; &nbsp; ...}for (Item item : items) {&nbsp; &nbsp; ...}那么为什么同一个参数对迭代器不成立?Iterator<Iter> iter.....while (iter.hasNext()) {&nbsp; &nbsp; Item item = iter.next();&nbsp; &nbsp; ...}for (Item item : iter) {&nbsp; &nbsp; ...}在这两种情况下,都已删除了对hasNext()和next()的调用,并且在内部循环中没有对迭代器的引用。是的,我知道可以重复使用Iterables来创建多个迭代器,但是所有这些事情都发生在for循环之外:在循环内,每次迭代器返回的项都只能向前推进一个。同样,允许这样做也将使for循环易于用于枚举,正如其他地方所指出的,它类似于Iterators not Iterables。因此,不要使Iterator实现Iterable,而是更新for循环以接受其中任何一个。干杯,
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答