我正在编写一个迭代器,它通过委托给" current"来迭代列表列表。列出自己的迭代器。 (不,我不是,但这只是一个简单的例子)。现在,当我到达一个列表的末尾时,我需要更新代理以指向下一个列表'迭代器。我可以在" hasNext"?或者更好地实施" next"在回到来电者之前?我觉得" hasNext"应该更好地免费副作用。您对此有何看法?
答案 0 :(得分:9)
hasNext
只要不能从外面察觉到副作用就可以了。最重要的是,它必须是幂等。实际情况是hasNext
无法知道是否有下一个没有取出它,并且即使它可以“取消”,也可以缓存。
答案 1 :(得分:3)
Guava的Iterators.concat
就是这么做的。来自javadocs,它:
public static <T> Iterator<T> concat(Iterator<? extends Iterator<? extends T>> inputs)
将多个迭代器组合到一个迭代器中。归来了 迭代器遍历{@code中每个迭代器的元素 输入}。在必要时,不会轮询输入迭代器。
如果查看source code,您会看到hasNext
方法将current
迭代器更改为下一个迭代器,即它没有副作用,所以这种方法没问题