`Iterator`可以直接和间接地与`Iterable'无关使用吗?

时间:2017-11-21 10:58:27

标签: java

在Java中

  • Iterator始终与Iterable一起使用?

  • 是否始终通过Iterator方法直接或间接创建或获取Iterable.iterator()个实例?

  • Iterator是否可以直接和间接地与Iterable无关使用?

4 个答案:

答案 0 :(得分:3)

Iterator并非必须始终与Iterable一起使用,但通常会将它们一起使用。

只要实现Iterator接口的类可以访问保存要迭代的元素的结构,就可以在不使用Iterable.iterator()方法的情况下创建Iterator实例。 / p>

Iterator与[{1}}无关。没有什么可以阻止您创建实现Iterable接口的类,并开始迭代Iterator

也就是说,Iterator用作生成适合迭代某些元素组的新Iterable实例的工厂。因此,将它们一起使用是有意义的。

不是拥有一个类Iterator和一个独立的MyContainer<Element>,而是拥有MyContainerIter<Element> implements Iterator<Element>通常很有用,并且将MyContainer<Element> implements Iterable<Element>的实现作为内部类。这允许Iterator实现访问包含您希望迭代的元素的类的非公共成员。

答案 1 :(得分:1)

tl; dr Iterator可以在没有Iterable的情况下使用,但它们在一起会更好。

  

Iterator始终与Iterable一起使用?

完全没有:图书馆里的任何内容都不需要这个。

  

是否始终通过Iterator方法直接或间接创建或获取Iterable.iterator()个实例?

没有。 Iterator只是一个接口,您可以生成在您的代码中的任何位置实现它的类的实例。

  

Iterator是否可以直接和间接地与Iterable无关使用?

绝对。 IterableIterator个对象的工厂,但它不是获取这些对象的唯一方法。

这就是说,如果你实现了Iterable,并使用Iterator方法生成iterator()个实例,那么有很多方便。这是因为Java中的增强for循环是围绕Iterable构建的:你不能直接为它提供一个“原始”迭代器,但给它一个Iterable会产生一个隐藏一个短视的循环很多API调用你。实际上,增强的for循环允许您隐藏易于阅读的测序结构后面的IteratorIterable

答案 2 :(得分:0)

可以在不实施Iterator的情况下使用Iterable。但这样做很少有任何意义。例如,您将无法使用foreach循环。

答案 3 :(得分:0)

  
      
  • Iterator始终与Iterable一起使用?
  •   

- Iterable的定义是:

public interface Iterable<T> {
    Iterator<T> iterator();
}
  
      
  • 是否始终通过Iterator方法直接或间接创建或获取Iterable.iterator()个实例?
  •   

您可以在没有Iterator的情况下创建自己的Iterable

Iterator<Integer> iter = new Iterator<Integer>() {
    private int n;
    @Override
    public boolean hasNext() {
        return true;
    }

    @Override
    public Integer next() {
        return n++;
    }
};
  
      
  • Iterator是否可以直接和间接地与Iterable无关使用?
  •   

- 见上文。