【发布时间】:2016-12-14 20:49:33
【问题描述】:
有这个课
public class IteratorStuff {
private static final String EMPTY = "";
public static void main(String[] args) {
System.out.println("success:");
success(newCollection());
System.out.println("fail:");
fail(newCollection());
}
private static void fail(Collection<String> myCollection) {
Iterator<String> iterator = myCollection.iterator();
iterator.forEachRemaining(new Consumer<String>() {
public void accept(String s) {
if (s != EMPTY)
System.out.println("string = " + s);
else
iterator.remove();
}
});
}
private static Collection<String> newCollection() {
Collection<String> myList = new LinkedList<String>();
myList.add(EMPTY);
myList.add("1");
myList.add("2");
myList.add("3");
return myList;
}
private static void success(Collection<String> myCollection) {
Iterator<String> iterator = myCollection.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
if (s != EMPTY)
System.out.println("string = " + s);
else
iterator.remove();
}
}
}
它遍历字符串集合并删除特定的 EMPTY 字符串并打印其他字符串。 success(Collection) 实现工作正常。
失败者因 IllegalStateException 而中断。但是,它能够从迭代器中获取 EMPTY 字符串。这表明必须调用 next() 。另外,在默认的 forEachRemaining 实现中
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
next() 被调用并将任何元素传递给 action.accept()。另一方面,我似乎也找不到 LinkedList 返回的迭代器的实现。
这是一个错误吗?如何返回第一个元素并仍然导致 IllegalStateException?
此外,只有当第一个元素是 EMPTY 字符串时才会发生这种情况。
【问题讨论】:
-
因为 forEachRemaining 是迭代器中的默认方法。真的不明白你在问什么......
-
我不希望
iterator.remove()在forEachRemaining的上下文中工作,因为它可能没有在内部使用迭代器。它在success的情况下工作正常,因为您正在 使用迭代器并删除当前元素。但是,我没有您的文档参考,因此我将其发布为评论。由于forEachRemaining()没有指定它的迭代方式,所以没有理由让代码中的Iterator可用。 -
@JimGarrison 是的,我意识到它成功运行良好,因为它现在已按预期使用了很长时间。然而,forEachRemaining(最后在默认实现中)确实调用了 next() 并将结果传递给操作。
-
有趣的问题。我喜欢没有立即明显答案的问题,让我去看看GrepCode :-)