【发布时间】:2015-08-15 21:48:56
【问题描述】:
让我们取一个ArrayList 并用一些简单的东西填充它:
List<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(""+i);
}
我将尝试使用不同的流 API 方式删除一个名为 5 的成员。为此,我定义了方法,当使用带有迭代器的传统迭代时,它会给我一个ConcurentModificationException。
void removeMember(String clientListener) {
list.remove(clientListener);
}
这段代码给了我这个例外,我理解:
list.parallelStream()
.filter(string -> string.equalsIgnoreCase("5"))
.forEach(string -> removeMember(string));
但是,仅尝试 stream() 而不是 parallelStream() 会产生空指针异常 (NPE),这对我来说很奇怪:
list.stream()
.filter(string -> string.equalsIgnoreCase("5"))
.forEach(string -> removeMember(string));
现在将List 类型更改为LinkedList<>。最后一个带有stream() 的代码给了我一个ConcurentModificationException,而parallelStream() 突然起作用了!
所以,问题。
内部
parallelStream()厨房(分离器和其他魔法)是否足够聪明,可以对LinkedList使用这种元素删除?它会一直有效吗?为什么是
ArrayList的 NPE?为什么是 NPE,而不是ConcurentModificationException我的意思是。
【问题讨论】:
-
顺便说一下,你可以用
Integer.toString(i)代替""+i -
如果您因此可以显着提高速度,我不会感到惊讶。
-
如果您想从列表中删除与谓词匹配的元素,请使用
List.removeIf。
标签: java java-8 java-stream