【问题标题】:When would it be useful to implement Iterator but not Iterable?什么时候实现 Iterator 而不是 Iterable 会有用?
【发布时间】:2013-12-25 14:58:30
【问题描述】:

在不实现可迭代的情况下实现迭代器什么时候有用?

或者实现迭代器只是实现可迭代的副产品?

【问题讨论】:

    标签: java iterator


    【解决方案1】:

    这两者是相关的,但并不相同。

    ListIterable - 你可以得到它的Iterator。它不是Iterator

    Iterator 是一个一次性使用类,它可以使用 hasNextnext 方法沿对象的 Collection 进行迭代。

    Iterable 是一个 Collection 类,当调用 iterator() 方法时返回一个 Iterator 实例。

    我想说的是,我认为 没有 的情况是 Iterable 应该是 implements Iterator。由于Iterator 是一次性使用,我看不到Iterator 应该implements Iterable 的情况。

    【讨论】:

    • List 具有扩展 IteratorListIterator。那么为什么“它不是Iterator”呢?
    • List 实现了可迭代并且有一个迭代器的内部实现对吗?我想知道没有可迭代实现的迭代器实现。
    • @ferrerverck List 返回 Iterator,因为它是Iterable。它肯定不是Iterator - 那是ListIterator 的工作。
    • @graviton 数据库ResultSet。这是一个Iterator 模式,但它没有Iterable,它是查询的结果。
    • 对不起,我听不懂。来自官方文档:public interface ListIterator<E> extends Iterator<E>。为什么 ListIterator 不是迭代器?
    【解决方案2】:

    它们在语义和用例上非常相似,但在实现上有所不同。 Iterable 是一个简单的迭代器工厂,可以在 for 循环中使用。因此,实现 Iterable 可能更方便。

    for(String s : getIterable()){
        ...
    }
    

    对比:

    Iterator<String> it = getIterator();
    
    while(it.hasNext()){
        String s = it.next();
        ...
    }
    

    但是,在某些情况下,Iterator 可能不会被重新实例化,即当您运行 db 请求结果时,因此在这种情况下,如果不重新发送您的请求,您将无法使其成为 Iterable。

    【讨论】:

      【解决方案3】:

      一般来说,您可以实现一个 Iterable 或一个 Iterator 来隐藏集合的实现,使代码对集合进行迭代。任何一个都可以很好地工作。不同之处在于集合可以遍历多少次。迭代器只能遍历集合一次,而 Iterable 可以多次遍历集合。您可以通过向 Iterable 询问 Iterator 来遍历 Iterable,并且可以多次这样做。

      【讨论】:

      • 那么你知道我希望一个类在没有可迭代的情况下实现迭代器的例子吗?比如,什么时候有必要/更有用地只遍历一次集合?
      • +1。可重复性或缺乏可重复性是重要的区别。考虑从网络连接中读取线路。这是一个非常明智的迭代器,但是让它成为 Iterable 是行不通的。如果调用者第二次调用 iterator() 会发生什么?
      猜你喜欢
      • 2014-04-29
      • 2020-01-24
      • 2013-10-05
      • 2018-08-05
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 2020-01-10
      • 2010-09-23
      相关资源
      最近更新 更多