这是我对在1.8版之前的Java中使用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
和Iterator
的唯一目的,以使任何对象都可迭代吗?请让我知道,这两个接口还有其他用途吗? 最佳答案
您正确地说明了这些接口的用途。实际上,Iterable
声明可以通过提供特定于这些对象的Iterator
来迭代实现该类的对象。拥有它们是必要的,因为应该如何精确地迭代对象取决于其内部实现,因此Iterator
特定于给定的“集合”类。
话虽如此,值得注意的是,尽管这些接口在形式上是Java Collections框架的一部分,但它们可以应用于其他情况。例如,假设有一个虚构的API可以读取CSV文件,则可以声明一个CsvFile
类来实现Iterable<List<String>>
并使用专用的Iterator<List<String>>
遍历文件中的行,该List
会从文件中逐行读取一行并将其拆分为String
的next()
,以从Iterable
返回它。
这些接口的另一个重要目的是一种称为“针对每个”循环的语言功能-只有实现CsvFile
的类的对象才能对其进行迭代。因此,从上面给出有关Iterator
API的示例,它还将启用以下内容:
CsvFile csvFile = new CsvFile(pathToCsvFile);
for (List<String> record : csvFile) {
doSomethingWithIt(record);
}
由于“for each”循环纯粹是一种语言功能,因此编译器将像往常一样将其扩展为使用
AutoCloseable
。附言仅仅因为它伤害了我的眼睛,我想在上面的示例中补充一点,我还建议为
CsvFile
实现ojit_code并将其与try-with-resources一起使用。