建议不要在循环遍历迭代器时使用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);
}
答案 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列表只有三种方法,add
,remove
和hasNext
同样来自干净的代码,第二种方法看起来要好于第一种方法。
答案 3 :(得分:0)
使用迭代器时,应始终调用hasNext()方法。否则,在调用next()方法时可能会遇到NoSuchElementException。
答案 4 :(得分:0)
当然,您应该使用hasNext()
,但仅限于迭代集合,而不是用于填充集合。要填充集合,请处理集合本身,而不是它的迭代器和集合中的 read ,使用@JMelnik描述的for
循环。
填写收藏品
Collection<MyObject> list = ...;
while (something) {
list.add(myObject);
}
阅读集合
for (MyObject myObject : list) {
...
}