我来自 C# 背景,其中迭代器实现IDisposable接口。Java中是否有任何迭代器实现了类似的接口,使它们自动关闭?
4 回答
Java 的 Iterator 只是用于迭代某些对象集合的抽象。如果底层数据结构在迭代后需要一些清理(例如关闭文件),那么您需要保留对该底层对象的引用,以便您可以做任何必须做的事情来“处理”它。
在 Java 7 中,您可以创建自己的迭代器(或一个装饰器),它也恰好实现了 AutoCloseable。然后您可以在 try 块中使用它:
try ( Iterator<MyObject> it = new MyAutoCloseableIterator(list) ) {
while (it.hasNext()) {
MyObject obj = it.next();
}
}
在 try 块结束时,如果 Iterator 实现了 AutoCloseable 接口,“.close()”方法将自动调用它。
http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
但是,我不相信任何内置迭代器(通常是集合的内部类,因此不公开可用)实现此接口。
另一种选择是(再次)编写您自己的迭代器,并在“.hasNext()”方法返回 false 时关闭资源。
在Java中,Iterator
本身就是一个接口。而且它没有任何close()
方法。
方法总结
boolean hasNext()
如果迭代有更多元素,则返回 true。E next()
返回迭代中的下一个元素。void remove()
从底层集合中移除迭代器返回的最后一个元素(可选操作)。
它旨在替换Enumeration
Java 集合框架,并用于迭代集合。它基于Iterator
设计模式。
它的目的正是所提供的。即迭代。close
与等无关。
如果实现迭代器接口的类(例如Scanner )提供close
this 是Scanner
API 的一部分。与迭代器方面/接口无关