3

是否建议不要使用 iterator.hasNext() 在迭代器上循环?

例如,我想将值 obj 设置为列表的每个元素。我可以使用以下代码或通过在循环中使用 hasNext() 使其更具可读性。

int size = list.size();
ListIterator<? super T> itr = list.listIterator();
for (int i=0; i<size; i++) {
     itr.next();
     itr.set(obj);
}

代替这些行,我可以编写如下代码。

for (ListIterator<? super T> itr = list.listIterator(); itr.hasNext(); ) {
    itr.next();
    itr.set(obj);
}
4

5 回答 5

7

是否建议不要使用 iterator.hasNext() 在迭代器上循环?

不。hasNext是您使用迭代器进行迭代的标准方式。例如,这就是enhanced-for 语句在可迭代的幕后所做的事情。

话虽如此,您的代码已经是 ListIterator 特定的,因为您正在使用ListIterator.set- 所以您的第二个代码块目前实际上不会编译。即使这样做了,它也不起作用,因为您仍然需要调用next(). 不过,这会起作用:

for (ListIterator<? super T> itr = list.listIterator(); itr.hasNext(); ) {
    itr.next();
    itr.set(obj);
}
于 2012-05-11T06:27:20.853 回答
1

好吧,当 NetBeans 重构您的 for-each 循环以使用迭代器时,它们会以下列方式进行。

对于每个:

for (T object : list) {
}

迭代器模式:

for (Iterator<T> it = list.iterator(); it.hasNext();) {
    T object = it.next();
}

我认为在迭代时在迭代器上使用 hasNext() 是完全可以的。

于 2012-05-11T06:27:33.660 回答
1

没有这样的建议不要使用hasNext

Iterator API 列表只有三个方法addremovehasNext

同样从干净的代码来看,第二种方法看起来比第一种方法好得多。

于 2012-05-11T06:27:49.040 回答
0

使用迭代器时,应始终调用 hasNext() 方法。否则,在调用 next() 方法时可能会遇到 NoSuchElementException。

于 2012-05-11T06:28:23.777 回答
0

当然,您应该使用hasNext(),但仅用于迭代 集合,而不用于填充集合。要填充集合,请处理集合本身,而不是它的迭代器,并使用@JMelnik 描述的循环从集合中读取。for

填写收藏

Collection<MyObject> list = ...;
while (something) {
    list.add(myObject);
}

阅读收藏

for (MyObject myObject : list) {
    ...
}
于 2012-05-11T06:39:48.050 回答