以下是我对1.8之前版本中使用Iterable
和Iterator
的重要性的理解。
1)
java.util.AbstractList
是Iterable
,因为它实现了
Iterator<T> iterator();
,这是任何类Iterable
的合约。
2)
java.util.AbstractList
实现,
Iterator<T> iterator();
创建实例级内部类
private class Itr implements Iterator<E> { ... }
实施hasNext
,next
和remove
方法。
private class ListItr extends Itr implements ListIterator<E>{..}
只是List
类型实现的迭代器之上的额外工具。
3)
这是这两个接口的唯一目的Iterable
&amp; Iterator
,以使任何对象可以迭代?如果这两个接口还有其他目的,请告诉我吗?
答案 0 :(得分:4)
您说明这些接口的用途是正确的。确实Iterable
声明实现它的类的对象可以通过提供对这些对象特定的Iterator
来迭代。拥有它们是必要的,因为对象应该如何迭代取决于它的内部实现,因此Iterator
特定于给定的“集合”类。
尽管如此,值得注意的是,虽然这些接口正式是Java Collections框架的一部分,但它们可以应用于其他情况。例如,假设有一个用于读取CSV文件的虚构API,可以声明一个CsvFile
类来实现Iterable<List<String>>
并使用专用Iterator<List<String>>
迭代文件中的行,该文件将读取来自逐个归档并将其拆分为List
String
个,以便从next()
返回。
这些接口的另一个重要目的是称为“for each”循环的语言特性 - 只有实现Iterable
的类的对象才能被迭代。因此,考虑到上面关于CsvFile
API的示例,它还将启用以下内容:
CsvFile csvFile = new CsvFile(pathToCsvFile);
for (List<String> record : csvFile) {
doSomethingWithIt(record);
}
由于“for each”循环纯粹是一种语言特性,编译器会将其扩展为像往常一样使用Iterator
。
P.S。仅仅因为它伤害了我的眼睛,我想在上面的示例中添加它,我还建议为AutoCloseable
实施CsvFile
并将其与try-with-resources一起使用。
答案 1 :(得分:0)
java.util.Collection接口扩展到java.util.Iterable。 Iterable有一个生成迭代器的方法。如果任何类实现了iterable,它有一个生成java.util.Iterator的迭代器方法。
请参阅this post
答案 2 :(得分:0)
如果你签出Iterable接口,它只有一个Iterator<T> iterator();
方法。因此除了提供迭代器方法之外,还有没有其他可能的用例来实现Iterable接口。
如果您看到 Iterator 界面的文档,请在另请参阅部分中找到 Collection,{{3} },ListIterator 。 Collection和ListIterator默认是Iterable,因为它们在内部扩展了Iterable。所以Iterable与Iterator一起使用。