让我们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()突然工作!
所以,问题.
内部parallelStream()厨房(Spliterators和其他魔法)是否足够聪明,可以使用这种元素去除LinkedList?它会一直有效吗?
为什么NPE适合ArrayList?为什么选择NPE,不是ConcurentModificationException我的意思.