使用并行流列出设置空值

我有以下代码


final String arr[] = {"A", "B", "C", "D"};

final List<String> list1 = new ArrayList<>();

final List<String> list2 = Arrays.asList(arr).parallelStream()

                          .peek(s -> list1.add(s + s))

                          .map(s -> s + s)

                          .collect(Collectors.toList());

System.out.println(list1);

System.out.println(list2);

我得到以下结果:


[null, AA, DD, null]

[AA, BB, CC, DD]

为什么某些元素显示null在 list1 中?我知道我应该使用SynchronizedListwith parallelStream,但null值让我感到惊讶。一旦您向列表中添加了一些内容,就应该设置该插槽,并且下一次执行应该为其添加另一个值。


侃侃无极
浏览 159回答 1
1回答

翻翻过去那场雪

ArrayList是不是线程安全的集合,并尝试从多个线程更新它parallelStream,你看到的是结果resizing的,内部阵列ArrayList-该操作不是线程安全的要么,你先增加数组并再移动元素它:可能是元素尚未移动而您尝试访问它。为了使它更加明确,调整大小时发生一个新的阵列与增大的尺寸创建-如果充满了这种新的阵列null小号只复制发生之后。真的无法预测会发生什么,只是不要依赖任何这些。编辑我不能将此作为评论发布,但这里有一些代码证明null可以看到:List<Integer> result = IntStream.iterate(0, i -> i + 1)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .takeWhile(i -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String arr[] = { "A", "B", "C", "D", "E", "F", "G", "H", "R", "T" };&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<String> list = new ArrayList<>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Arrays.stream(arr)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .parallel()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .peek(list::add)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .forEach(x -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (list.contains(null)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("It took " + i + " steps to see a null");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .boxed()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toList());
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java