为什么基本的Java迭代器没有像peek()这样的函数,可以返回下一个元素而不会推进迭代器?
为什么基本的Java迭代器没有像peek()这样的函数,可以返回下一个元素而不会推进迭代器?
1 - 不管价值如何,似乎大多数其他语言都为它们的标准迭代器API做出了相同的决定。Rust似乎是个例外;请参见https://doc.rust-lang.org/std/iter/struct.Peekable.html。
2 - ……基于一项高度非科学的“调查”,使用谷歌搜索。
peek()
功能的迭代器抽象层,可以扩展Iterator
接口并自行实现迭代器。事实上,通用的带有peek
的迭代器可以很容易地作为常规Iterator
的包装器实现。Iterator
实现的一个属性。 - Stephen ChasNext()
来修复下一个元素的可用性。 - user207421it
由多个线程共享,则if (it.hasNext()) e = it.next();
不是原子性的。我认为这使得peek
的原子性变得无关紧要。 - Stephen Cpeek
方法的迭代器。 remove
的实现留给读者自行完成。import java.util.Iterator;
/**
* An Iterator with a peek method for just one value.
*/
public class PeekIterator<T> implements Iterator<T>
{
private Iterator<T> iterator;
public PeekIterator (Iterator<T> iterator) { this.iterator = iterator; }
private boolean peeked = false;
private T peeked_value = null;
public boolean hasNext () { return iterator.hasNext () || peeked; }
public T next ()
{
T value;
if (peeked) {
peeked = false;
value = peeked_value;
}
else
if (iterator.hasNext ())
value = iterator.next();
else
value = null;
return value;
}
public T peek ()
{
T value;
if (peeked)
value = peeked_value;
else {
peeked = true;
if (iterator.hasNext ())
peeked_value = iterator.next ();
else
peeked_value = null;
value = peeked_value;
}
return value;
}
}
hasNext
方法存在一个 bug。应该修改为 iterator.hasNext() || peeked
,因为 peek
方法有可能会消耗基本迭代器的最后一个元素,导致基本迭代器为空。但是在 PeekIterator 中,我们仍然需要消耗那个被预先查看的元素。 - Consti P