番石榴循环如何实现

时间:2015-10-31 19:07:14

标签: java guava

我试图弄清楚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;
  }
};

}

然而,它没有显示这是如何实现的。我可能错过了一些东西。

1 个答案:

答案 0 :(得分:3)

这部分代码

if (!iterator.hasNext()) {
  iterator = iterable.iterator();
}

检查旧迭代器是否没有更多元素。当这是真的时,它只是获得新的迭代器,它将让我们重新开始。