我正在编写一个迭代器,它通过委托给“当前”列表自己的迭代器来迭代列表列表。(不,我不是,但这是一个简单的例子)。现在,当我到达一个列表的末尾时,我需要更新委托以指向下一个列表的迭代器。我可以在“hasNext”中执行此操作吗?还是在返回给调用者之前在“下一步”中实施更好?我觉得“hasNext”最好是没有副作用的。您对此有何看法?
问问题
665 次
2 回答
9
hasNext
只要从外部无法察觉,产生副作用是可以的。最重要的是,它必须是幂等的。实际上经常hasNext
出现不获取就无法知道是否有next的情况,即使可以“取消获取”,缓存也是可以的。
于 2012-11-08T14:47:54.577 回答
3
番石榴就是Iterators.concat
这样做的。从javadocs,它:
public static <T> Iterator<T> concat(Iterator<? extends Iterator<? extends T>> inputs)
将多个迭代器组合成一个迭代器。返回的迭代器遍历 {@code 输入} 中每个迭代器的元素。输入迭代器只有在必要时才会轮询。
如果您查看源代码,您将看到该hasNext
方法将current
迭代器更改为下一个迭代器,即它并非没有副作用,因此这种方法是可以的。
于 2012-11-08T14:59:55.057 回答