gpt4 book ai didi

java - Collections.singleton() 和 forEachRemaining - Java 8

转载 作者:搜寻专家 更新时间:2023-11-01 01:31:48 26 4
gpt4 key购买 nike

在处理 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com