java中的Iterable和Iterator

时间:2015-07-23 04:51:54

标签: java iterator

以下是我对1.8之前版本中使用IterableIterator的重要性的理解。

1)

java.util.AbstractListIterable,因为它实现了

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)

这是这两个接口的唯一目的Iterable&amp; Iterator,以使任何对象可以迭代?如果这两个接口还有其他目的,请告诉我吗?

3 个答案:

答案 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一起使用。