何时实现迭代器而不是可迭代对象会有用?

3

在不实现可迭代接口的情况下实现迭代器有何用处?

或者说,实现迭代器只是实现可迭代接口的副产品吗?

3个回答

4
这两者相关但并不相同。
一个 ListIterable - 你可以获取它的 Iterator。但它本身并不是一个 Iterator
一个 Iterator 是一个单次使用的类,可以使用 hasNextnext 方法在 Collection 的对象上进行迭代。
一个 Iterable 是一个 Collection 类,当调用 iterator() 方法时返回一个 Iterator 实例。
我甚至可以说我从未见过一种情况,Iterable 应该实现 Iterator。由于 Iterator 是单次使用的,我也看不出一种情况,Iterator 应该实现 Iterable

列表实现可迭代,并具有迭代器的内部实现,对吗?我想知道是否存在没有可迭代实现的迭代器实现。 - graviton
@ferrerverck List 返回一个 Iterator,因为它是 Iterable。它绝对不是一个 Iterator - 这是 ListIterator 的工作。 - Boris the Spider
很抱歉,我无法理解。从官方文档来看:public interface ListIterator<E> extends Iterator<E>。为什么ListIterator不是一个Iterator? - ferrerverck
@ferrerverck ListIterator 肯定是一个 Iterator,但它不是一个 List 也不是可遍历的。这是两个完全不同的类,对吧? - Boris the Spider
@ferrerverck - 我认为Boris的意思是List本身不是迭代器(它没有实现迭代器)。它确实实现了可迭代接口,因此它是一个可迭代对象。可迭代对象需要一个返回迭代器的方法,因此它有一个内部实现,所以它的方法返回一个迭代器,但它本身并不是一个迭代器。 - graviton
显示剩余2条评论

1

一般来说,您将实现一个Iterable或Iterator来隐藏集合的实现,以使正在迭代集合的代码看不到其实现。两者都可以很好地工作。不同之处在于集合可以遍历多少次。迭代器只能遍历集合一次,而Iterable可以多次遍历集合。您可以通过请求Iterator来遍历Iterable,您可以多次执行此操作。


你知道一个例子,我何时需要让一个类实现迭代器而不是可迭代对象吗?也就是说,在什么情况下只遍历一次集合会更有必要/更有用? - graviton
+1. 可重复性或缺乏可重复性是重要的区别。考虑从网络连接中读取行。这是一个完全合理的迭代器,但将其变为可迭代的不起作用。如果调用者第二次调用iterator()会发生什么? - Stuart Marks

0

它们在语义和用法上非常相似,但在实现上有所不同。Iterable是一个简单的迭代器工厂,可以在for循环中使用。因此,实现一个Iterable可能更方便。

for(String s : getIterable()){
    ...
}

对比:

Iterator<String> it = getIterator();

while(it.hasNext()){
    String s = it.next();
    ...
}

然而,在某些情况下,迭代器可能不会被重新实例化,例如当您遍历数据库请求结果时,因此在这种情况下,您无法使其可迭代而不重新发送请求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接