在Java中
Iterator
始终与Iterable
一起使用?
是否始终通过Iterator
方法直接或间接创建或获取Iterable.iterator()
个实例?
Iterator
是否可以直接和间接地与Iterable
无关使用?
答案 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
无关使用?
绝对。 Iterable
是Iterator
个对象的工厂,但它不是获取这些对象的唯一方法。
这就是说,如果你实现了Iterable
,并使用Iterator
方法生成iterator()
个实例,那么有很多方便。这是因为Java中的增强for
循环是围绕Iterable
构建的:你不能直接为它提供一个“原始”迭代器,但给它一个Iterable
会产生一个隐藏一个短视的循环很多API调用你。实际上,增强的for
循环允许您隐藏易于阅读的测序结构后面的Iterator
和Iterable
。
答案 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
无关使用?
是 - 见上文。