java - Guava循环是如何实现的

标签 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;
  }
};

}

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

最佳答案

这部分代码

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

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

关于java - Guava循环是如何实现的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33455474/

相关文章:

Java:将 java.awt.Color 转换为 javafx.scene.paint.Color

java - 如何使用 Unity 2017 更改为 64 位?

java - 无法删除列 MSSQL(在 Hibernate 之后?)

java - Multimap如何从键返回所有值

kotlin - 为什么 CompletableFuture 和 ListenableFuture 的协程构建器之间存在差异?

java - 我试图取 1020 的 275 次方,并将其修改为 1073,但 java 不会输出正确的答案

java - HTTP 状态 500 - servlet fitTrackerServlet 的 Servlet.init() 抛出异常

java - 正确实现Guava的MurMurHash

java - 与 Guava HashBiMap 和 synchronizedBiMap 同步

hadoop - 关于 Guava jar 的问题