java中的Iterable和迭代器
以下是我对在1.8Java之前版本中使用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
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
而不是集合的类的真实例子。