Iterator.hasNext应该是副作用吗?

时间:2012-11-08 14:45:38

标签: java

我正在编写一个迭代器,它通过委托给" current"来迭代列表列表。列出自己的迭代器。 (不,我不是,但这只是一个简单的例子)。现在,当我到达一个列表的末尾时,我需要更新代理以指向下一个列表'迭代器。我可以在" hasNext"?或者更好地实施" next"在回到来电者之前?我觉得" hasNext"应该更好地免费副作用。您对此有何看法?

2 个答案:

答案 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迭代器更改为下一个迭代器,即它没有副作用,所以这种方法没问题