任何自动关闭的Java迭代器(如C#)?

时间:2012-08-20 10:41:12

标签: c# java iterator idisposable

我来自C#后台,迭代器实现IDisposable接口。 Java中是否有任何迭代器实现了类似的接口,使它们自动关闭?

4 个答案:

答案 0 :(得分:7)

Java的迭代器只是迭代某些对象集合的抽象。如果底层数据结构在迭代后需要进行一些清理(例如关闭文件),那么你需要保留对该底层对象的引用,这样你就可以做任何必须做的事情来“处理”它。

答案 1 :(得分:4)

在Java 7中,您可以创建自己的迭代器(或者一个装饰器),这也恰好实现了AutoCloseable。然后,您可以在try块中使用它:

try ( Iterator<MyObject> it = new MyAutoCloseableIterator(list) ) {
    while (it.hasNext()) {
       MyObject obj = it.next();
    }
}

在try块结束时,如果Iterator实现了AutoCloseable接口,那么&#34; .close()&#34;方法将自动调用它。

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

但是我不相信任何内置的迭代器(通常是集合的内部类,因此不公开)都实现了这个接口。

另一种选择是(再次)编写自己的迭代器代码,并在&#34; .hasNext()&#34;方法返回false。

答案 2 :(得分:1)

在Java中,Iterator本身就是一个接口。并且它没有任何close()方法。

答案 3 :(得分:1)

这是Iterator

提供的API
  

方法摘要

     

boolean hasNext()
            如果迭代具有更多元素,则返回true。 E next()
            返回迭代中的下一个元素。 void remove()
            从底层集合中删除迭代器返回的最后一个元素(可选操作)。

它旨在替换Java集合框架中的Enumeration,并用于迭代集合。它基于Iterator设计模式 它的目的正是提供的。即迭代。与close等无关 如果是实现迭代器接口的类,例如Scanner提供close这是Scanner API的一部分。与迭代器方面/接口无关