Java中的Iterable和Iterator

4

这里是我对于在1.8之前的Java中使用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)

这两个接口IterableIterator的唯一目的是使任何对象都可以进行迭代吗?请告诉我,如果这两个接口还有其他用途吗?


1
“signify their existence” 是什么意思? - Eran
https://dev59.com/GGw15IYBdhLWcg3wCnYn - Renjith
https://dev59.com/L2025IYBdhLWcg3wtofX - Renjith
@Eran 它们的使用存在 - overexchange
你描述了在AbstractList中如何实现Iterable。除此之外,你的问题仍然不太清楚。 - Eran
@Eran,现在查询清楚了吗? - overexchange
3个回答

4
你说得没错,这些接口的作用确实是如此。事实上,Iterable 声明了实现它的类的对象可以通过提供特定于这些对象的 Iterator 进行迭代。拥有它们是必要的,因为对象应该如何进行迭代取决于其内部实现,因此一个 Iterator 是针对给定的“集合”类的。
话虽如此,值得注意的是,尽管这些接口形式上是 Java 集合框架的一部分,但它们也可以应用于其他情况。例如,假设有一个读取 CSV 文件的虚构 API,那么可以声明一个 CsvFile 类来实现 Iterable<List<String>> 并使用专门的 Iterator<List<String>> 迭代文件中的行,该迭代器将逐行读取文件并将其拆分成 StringList 以从 next() 中返回。
这些接口的另一个重要目的是一种称为“for each”的语言特性 - 只有实现 Iterable 接口的类的对象才能使用它进行迭代。因此,给出上面关于 CsvFile API 的例子,它还将启用类似于以下内容的操作:
CsvFile csvFile = new CsvFile(pathToCsvFile);
for (List<String> record : csvFile) {
    doSomethingWithIt(record);
}

作为“for each”循环是一种纯语言特性,编译器将按照通常的方式扩展它来使用一个迭代器。
附言:仅仅因为这让我感到难受,我想要补充一点,在上面的例子中,我也建议为CsvFile实现一个AutoCloseable,并在try-with-resources中使用它。

java.util.ServiceLoader 是一个实现 Iterable 接口但不是 Collection 的类的真实例子。 - Holger

0

java.util.Collection接口扩展到java.util.Iterable。Iterable具有生成迭代器的方法。如果任何类实现了iterable,则它具有生成java.util.Iterator的迭代器方法。

请参考此帖子


我不认为 OP 在询问这个实现,而是询问除此之外的任何其他用例。 - Naman Gala

0

如果您查看接口Iterable,它只有一个方法,即Iterator<T> iterator();。因此,除了提供迭代器方法之外,没有其他可能的用例来实现Iterable接口。

如果您查看Iterator接口的文档,在参见部分中,您将找到Collection, ListIterator, Iterable。集合和列表迭代器默认情况下都扩展了Iterable,因此Iterable与Iterator一起使用。


1
另一个要点是,行为责任被分配在IterableIterator接口之间。不能像Iterable一样单独的接口承担所有4个方法hasNext next removeiterator的责任吗?我的意思是,我不理解为什么要有两个接口IterableIterator,而不是一个。这种设计方式的思考过程是什么? - overexchange
这只是代码分割。你可以看到Iterator与Iterable一起使用,而其他接口仅扩展Iterable,因此功能直接保留在Interable上。 - Naman Gala
而且迭代器与可迭代对象是独立的。因此功能被分开了。可迭代对象的功能是提供迭代器对象,而迭代器的功能是提供next、remove、hasNext函数。 - Naman Gala
我的观点是,他们本可以把所有的方法名称都放在“Iterable”中,而不是创建另一个接口“Iterator”。 - overexchange
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Naman Gala
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接