Почему я могу собрать параллельный поток в произвольно большой массив, но не последовательный поток?

Отвечая на этот вопрос, я столкнулся с особенной особенностью. Следующий код работает так, как я предполагал (первые два значения в существующем массиве будут переопределены):

Integer[] newArray = Stream.of(7, 8)
                           .parallel()
                           .toArray(i -> new Integer[] {1, 2, 3, 4, 5, 6});

System.out.println(Arrays.toString(newArray));

Выход:

[7, 8, 3, 4, 5, 6]

Однако попытка этого с последовательным потоком выдает IllegalStateException:

Integer[] newArray = Stream.of(7, 8)
                           .toArray(i -> new Integer[] {1, 2, 3, 4, 5, 6});

System.out.println(Arrays.toString(newArray));

Выход:

Exception in thread "main" java.lang.IllegalStateException: Begin size 2 is not equal to fixed size 6
    at java.base/java.util.stream.Nodes$FixedNodeBuilder.begin(Nodes.java:1222)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:483)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:550)
    at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
    at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:517)
    at test/test.Test.main(Test.java:30)

Мне любопытно, почему последовательный поток не перезаписывает элементы массива, как это делает параллельный поток. Я немного искал и не мог найти документацию по этому поводу, но я предполагаю, что он существует где-то.

Ответы

Ответ 1

Функция generator требуется для создания "нового массива желаемого типа и предоставленной длины ". Если вы не соблюдаете спецификацию, поведение не определено.