【问题标题】:Any Java Iterators that close automatically (like C#)?任何自动关闭的 Java 迭代器(如 C#)?
【发布时间】:2012-08-20 20:36:33
【问题描述】:

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

【问题讨论】:

标签: c# java iterator idisposable


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在 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 时关闭资源。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这是Iterator提供的API

        方法总结

        布尔 hasNext()
        如果迭代有更多元素,则返回 true。 E 下一个()
        返回迭代中的下一个元素。无效删除()
        从基础集合中移除迭代器返回的最后一个元素(可选操作)。

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

        【讨论】:

          猜你喜欢
          • 2015-02-12
          • 1970-01-01
          • 2016-03-21
          • 1970-01-01
          • 2021-06-23
          • 2016-04-17
          • 2016-07-04
          • 1970-01-01
          • 2015-03-02
          相关资源
          最近更新 更多