番石榴循环是如何实现的
Guava cycle how is it achieved
我想弄清楚 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;
}
};
}
但是它并没有显示这是如何实现的。我可能遗漏了一些东西。
这部分代码
if (!iterator.hasNext()) {
iterator = iterable.iterator();
}
检查旧迭代器是否没有更多元素。如果这是真的,它只会得到新的迭代器,让我们重新开始。
我想弄清楚 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;
}
};
}
但是它并没有显示这是如何实现的。我可能遗漏了一些东西。
这部分代码
if (!iterator.hasNext()) {
iterator = iterable.iterator();
}
检查旧迭代器是否没有更多元素。如果这是真的,它只会得到新的迭代器,让我们重新开始。