在不实现可迭代接口的情况下实现迭代器有何用处?
或者说,实现迭代器只是实现可迭代接口的副产品吗?
List
是 Iterable
- 你可以获取它的 Iterator
。但它本身并不是一个 Iterator
。Iterator
是一个单次使用的类,可以使用 hasNext
和 next
方法在 Collection
的对象上进行迭代。Iterable
是一个 Collection
类,当调用 iterator()
方法时返回一个 Iterator
实例。Iterable
应该实现 Iterator
。由于 Iterator
是单次使用的,我也看不出一种情况,Iterator
应该实现 Iterable
。一般来说,您将实现一个Iterable或Iterator来隐藏集合的实现,以使正在迭代集合的代码看不到其实现。两者都可以很好地工作。不同之处在于集合可以遍历多少次。迭代器只能遍历集合一次,而Iterable可以多次遍历集合。您可以通过请求Iterator来遍历Iterable,您可以多次执行此操作。
它们在语义和用法上非常相似,但在实现上有所不同。Iterable是一个简单的迭代器工厂,可以在for循环中使用。因此,实现一个Iterable可能更方便。
for(String s : getIterable()){
...
}
对比:
Iterator<String> it = getIterator();
while(it.hasNext()){
String s = it.next();
...
}
然而,在某些情况下,迭代器可能不会被重新实例化,例如当您遍历数据库请求结果时,因此在这种情况下,您无法使其可迭代而不重新发送请求。
List
返回一个Iterator
,因为它是Iterable
。它绝对不是一个Iterator
- 这是ListIterator
的工作。 - Boris the Spiderpublic interface ListIterator<E> extends Iterator<E>
。为什么ListIterator不是一个Iterator? - ferrerverckListIterator
肯定是一个Iterator
,但它不是一个List
也不是可遍历的。这是两个完全不同的类,对吧? - Boris the Spider