java - java中的可迭代对象和迭代器

标签 java iterator

这是我对使用 Iterable 意义的理解和 Iterator在 1.8 之前的 java 中。

1)

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

Iterator<T> iterator(); ,这是任何类的契约(Contract) Iterable .

2)

java.util.AbstractList工具,

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

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

实现了hasNext , nextremove方法。

private class ListItr extends Itr implements ListIterator<E>{..}只是 List 迭代器之上的一个额外设施类型实现。

3)

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

最佳答案

您说得对,这些接口(interface)的用途是什么。确实Iterable通过提供 Iterator 声明实现它的类的对象可以被迭代特定于这些对象。拥有它们是必要的,因为对象应该如何迭代取决于它的内部实现,以及 Iterator。因此特定于给定的“集合”类。

话虽如此,值得注意的是,虽然这些接口(interface)在形式上是 Java Collections 框架的一部分,但它们可以应用于其他情况。例如,给定一个读取 CSV 文件的假想 API,可以声明一个 CsvFile类来实现 Iterable<List<String>>并使用专用 Iterator<List<String>> 遍历文件中的行这将从文件中逐行读取行并将它们拆分为 ListString s 从 next() 返回它.

这些接口(interface)的另一个重要用途是称为“for each”循环的语言特性——仅实现类的对象 Iterable可以用它迭代。因此,给出上面关于 CsvFile 的示例API,它还将启用类似:

CsvFile csvFile = new CsvFile(pathToCsvFile);
for (List<String> record : csvFile) {
    doSomethingWithIt(record);
}

由于“for each”循环纯粹是一种语言特性,编译器会将其扩展为使用Iterator。和往常一样。

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

关于java - java中的可迭代对象和迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31578390/

相关文章:

java - 使用@Autowired 调用构造函数如何工作?

python - 如何迭代多个不同长度的列表,但重复较短列表的最后一个值,直到完成最长列表?

c++ - 如何在类主体中调用模板函数?

c++ - 为我的链表实现一个迭代器类。 using关键字是什么?

c++ - 在使用 vector 和迭代器时与 const 行为作斗争

php - RecursiveIteratorIterator 最后一个 child

java - 批量运行 30 个 jar 并保存每个 jar 的输出结果

Java 风格 : Variable declaration in a switch

java - Appengine 数据存储区父级或索引

java - 从 Maven 项目资源文件夹 (src/main/resources) 加载 excel(.xlsx/.xls) 文件