java中的Iterable和迭代器

java中的Iterable和迭代器,java,iterator,Java,Iterator,以下是我对在1.8Java之前版本中使用Iterable和Iterator的意义的理解 (一) java.util.AbstractList是Iterable,因为它实现 Iterator迭代器(),它是任何类都可的契约 (二) java.util.AbstractList实现 Iterator迭代器()通过创建实例级内部类 private class Itr implements Iterator<E> { ... } private类Itr实现迭代器{…} 它实现了hasNe

以下是我对在1.8Java之前版本中使用
Iterable
Iterator
的意义的理解

(一)

java.util.AbstractList
Iterable
,因为它实现

Iterator迭代器()
,它是任何类都可
的契约

(二)

java.util.AbstractList
实现

Iterator迭代器()通过创建实例级内部类

private class Itr implements Iterator<E> { ... }
private类Itr实现迭代器{…}
它实现了
hasNext
next
remove
方法

私有类ListItr扩展了Itr实现ListIterator{..}
只是上述迭代器的一个额外功能,用于
列表
类型实现

(三)


这是这两个接口
Iterable
Iterator
的唯一目的,以使任何对象都是Iterable的吗?请告诉我这两个接口是否还有其他用途?

java.util.Collection接口扩展到java.util.Iterable。Iterable有一个生成迭代器的方法。如果有任何类实现了iterable,那么它有一个迭代器方法来生成java.util.iterator


如果您签出interface Iterable,请参阅,它只有一个方法是
迭代器迭代器()。因此,除了提供迭代器方法外,没有其他可能的用例来实现Iterable接口


如果您看到界面的文档,请参见部分,您将找到。Collection和ListIterator默认为Iterable,因为它们在内部扩展了Iterable。因此Iterable与迭代器一起使用。

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

尽管如此,值得注意的是,尽管这些接口在形式上是Java集合框架的一部分,但它们可以应用于其他情况。例如,给定一个读取CSV文件的虚拟API,可以声明一个
CsvFile
类来实现一个
Iterable
,并使用专用的
迭代器对文件中的行进行迭代,迭代器将逐行读取文件中的行,并将它们拆分为
字符串的
列表,以从
下一个()

这些接口的另一个重要用途是一种称为“for-each”循环的语言特性—只有实现了
Iterable
的类的对象才能与其进行迭代。因此,上面给出了一个关于
CsvFile
API的示例,它还将启用以下功能:

CsvFile csvFile = new CsvFile(pathToCsvFile);
for (List<String> record : csvFile) {
    doSomethingWithIt(record);
}
CsvFile CsvFile=新的CsvFile(pathToCsvFile);
对于(列表记录:csvFile){
dosomethingwhithit(记录);
}
由于“for-each”循环纯粹是一种语言特性,编译器将像往常一样扩展它以使用
迭代器


顺便说一句,只是因为它伤了我的眼睛,我想补充一点,在上面的例子中,我还建议为
CsvFile
实现一个
AutoCloseable
,并将其与try with resources一起使用。

你所说的
表示它们的存在是什么意思?@Eran它们的存在用法你描述了如何在AbstractList中实现Iterable。除此之外,还不清楚您在问什么。我认为OP不是在问这个实现,而是在问除此之外的任何其他用例。另一点是,行为责任分为
Iterable
Iterator
接口。像
Iterable
(say)这样的单一接口不能承担所有4种方法
hasNext
next
删除
迭代器
的责任吗?我的意思是,我没有得到两个接口的思考过程,
Iterable
Iterator
,而不是一个。这样设计的思想过程是什么?它只是代码划分。您可以看到迭代器与Iterable一起使用,而其他接口仅扩展Iterable,因此功能直接保留在Interable上,而且迭代器独立于Iterable。因此,功能被划分。Iterable的功能是提供迭代器对象,迭代器的功能是提供next、remove、hasNext函数。您的意思是说,
接口集合实现Iterable
?是的,但是
AbstractList
的内部类,即
Itr
,必须实现
Iterator
,才能使其完整。是的,因为您希望外部世界使用迭代器功能,也希望将实现隐藏到内部类中。考虑每个人使用自己的方法名称,这会造成混乱,因此,他们正在实现迭代器来实现他们的逻辑,并提供直接作为迭代器对象而不是Itr对象使用的自由。
java.util.ServiceLoader
是实现
Iterable
而不是
集合的类的真实例子。