我试图弄清楚Guava是如何创建迭代器的,这个迭代器在自身上无限循环但是我无法理解它。
public static <T> Iterable<T> cycle(final Iterable<T> iterable) {
checkNotNull(iterable);
return new FluentIterable<T>() {
@Override
public Iterator<T> iterator() {
return Iterators.cycle(iterable);
}
@Override public String toString() {
return iterable.toString() + " (cycled)";
}
};
}
public static <T> Iterator<T> cycle(final Iterable<T> iterable) {
checkNotNull(iterable);
return new Iterator<T>() {
Iterator<T> iterator = emptyIterator();
Iterator<T> removeFrom;
@Override
public boolean hasNext() {
if (!iterator.hasNext()) {
iterator = iterable.iterator();
}
return iterator.hasNext();
}
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
removeFrom = iterator;
return iterator.next();
}
@Override
public void remove() {
checkRemove(removeFrom != null);
removeFrom.remove();
removeFrom = null;
}
};
}
然而,它没有显示这是如何实现的。我可能错过了一些东西。
答案 0 :(得分:3)
这部分代码
if (!iterator.hasNext()) {
iterator = iterable.iterator();
}
检查旧迭代器是否没有更多元素。当这是真的时,它只是获得新的迭代器,它将让我们重新开始。