在处理 Collections.singleton()
时,我发现它没有按预期工作。如果您在 forEachRemaining
之后看到下面的代码,代码既没有抛出任何 exception
也没有在 itr.hasNext()
上返回 false
>
来自 forEachRemaining
的 Java 文档
Performs the given action for each remaining element until all elements have been processed
下面代码的输出是:true,elem 我期待的是false,NoSuchElementException
public class Test {
public static void main(String[] args) {
Collection<String> abc = Collections.singleton("elementsItr");
final Iterator<String> itr = abc.iterator();
try {
itr.forEachRemaining((e) -> {
throw new RuntimeException();
});
} catch (RuntimeException e) {
}
System.out.println(itr.hasNext());
System.out.println(itr.next());
}
}
请帮助我理解这种行为。
最佳答案
查看代码:Collections.singleton()
返回一个 SingletonSet
。如果您在 SingletonSet
上调用 iterator()
,生成的迭代器属于匿名类。匿名类覆盖 forEachRemaining
:
public void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
if (hasNext) {
action.accept(e);
hasNext = false;
}
}
由于您的accept
抛出异常,hasNext
保持true
。
请注意,如果抛出异常,javadoc 没有指定 forEachRemaining
应该发生什么;因此,下一个运行时版本可能会将 hasNext = false
置于 action.accept(e)
之上,从而导致不同的结果。因此,您不能指望一种或另一种行为。
关于java - Collections.singleton() 和 forEachRemaining - Java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45158978/