这是我对在1.8版之前的Java中使用IterableIterator的重要性的理解。

1)
java.util.AbstractList之所以是Iterable,是因为它实现了,
Iterator<T> iterator();,这是任何类都必须成为Iterable的合同。

2)
java.util.AbstractList工具,

通过创建实例级别的内部类Iterator<T> iterator();

private class Itr implements Iterator<E> { ... }

实现hasNextnextremove方法的代码。
private class ListItr extends Itr implements ListIterator<E>{..}只是List类型实现的迭代器之上的一项额外功能。

3)

这是这两个接口IterableIterator的唯一目的,以使任何对象都可迭代吗?请让我知道,这两个接口还有其他用途吗?

最佳答案

您正确地说明了这些接口的用途。实际上,Iterable声明可以通过提供特定于这些对象的Iterator来迭代实现该类的对象。拥有它们是必要的,因为应该如何精确地迭代对象取决于其内部实现,因此Iterator特定于给定的“集合”类。

话虽如此,值得注意的是,尽管这些接口在形式上是Java Collections框架的一部分,但它们可以应用于其他情况。例如,假设有一个虚构的API可以读取CSV文件,则可以声明一个CsvFile类来实现Iterable<List<String>>并使用专用的Iterator<List<String>>遍历文件中的行,该List会从文件中逐行读取一行并将其拆分为Stringnext(),以从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一起使用。

10-05 20:59
查看更多