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

标签 java

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

相关文章:

java - 每次调用方法时绘制矩形

java - JNI,从 C++ 调用 Java,CallObjectMethod 上的 SIGSEGV

java - 合并锁会降低性能吗?

java - 凯撒密码 Java 程序无法移位超过 23

java - 在 View 模式中打开 session

java - Android SeekBar NullPointerException

java - 使用 JAX-WS : How can I set the user agent property

java - 我应该如何处理 SwingUtilities.invokeAndWait 抛出的异常

java - java中只接受唯一的输入

java - 查找包含给定坐标的区域