小编rap*_*cha的帖子

Java 8流API:修改列表时的例外情况

让我们ArrayList用一些简单的东西来填充它:

List<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    list.add(""+i);
}
Run Code Online (Sandbox Code Playgroud)

我将尝试使用不同的流API方法删除一个名为5的成员.为此我定义了方法,这将给我一个ConcurentModificationException使用迭代器的传统迭代.

void removeMember(String clientListener) {
    list.remove(clientListener);
}
Run Code Online (Sandbox Code Playgroud)

这段代码给了我这个例外,我明白了:

list.parallelStream()
    .filter(string -> string.equalsIgnoreCase("5"))
    .forEach(string -> removeMember(string));
Run Code Online (Sandbox Code Playgroud)

但是,尝试只是stream(),不parallelStream()给出空指针异常(NPE),这对我来说很奇怪:

list.stream()
    .filter(string -> string.equalsIgnoreCase("5"))
    .forEach(string -> removeMember(string));
Run Code Online (Sandbox Code Playgroud)

现在将List类型更改为LinkedList<>.最后的代码stream()给了我一个ConcurentModificationException,parallelStream()突然工作!

所以,问题.

  1. 内部parallelStream()厨房(Spliterators和其他魔法)是否足够聪明,可以使用这种元素去除LinkedList?它会一直有效吗?

  2. 为什么NPE适合ArrayList?为什么选择NPE,不是ConcurentModificationException我的意思.

java java-8 java-stream

24
推荐指数
3
解决办法
9968
查看次数

标签 统计

java ×1

java-8 ×1

java-stream ×1