我们应该避免在Iterator中调用hasNext()吗?

时间:2012-05-11 06:23:35

标签: java iterator

建议不要在循环遍历迭代器时使用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);
}

5 个答案:

答案 0 :(得分:7)

  

建议不要在循环遍历迭代器时使用iterator.hasNext()吗?

嗯,不。 hasNext是使用迭代器迭代的标准方式。例如,enhanced-for statement就是可迭代的幕后操作。

话虽如此,您的代码已经是特定于ListIterator的,因为您正在使用ListIterator.set - 因此您的第二个代码块目前不会实际编译。即使它确实如此,它也行不通,因为你仍然需要拨打next()。这可以工作:

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

答案 1 :(得分:1)

那么,当NetBeans重构每个循环来使用迭代器时,他们会按照以下方式进行重构。

的for-each:

for (T object : list) {
}

迭代器模式:

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

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

答案 2 :(得分:1)

没有这样的建议不使用hasNext

Iterator API列表只有三种方法,addremovehasNext

同样来自干净的代码,第二种方法看起来要好于第一种方法。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

填写收藏品

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

阅读集合

for (MyObject myObject : list) {
    ...
}