Ответ 1
Функция generator
требуется для создания "нового массива желаемого типа и предоставленной длины ". Если вы не соблюдаете спецификацию, поведение не определено.
Отвечая на этот вопрос, я столкнулся с особенной особенностью. Следующий код работает так, как я предполагал (первые два значения в существующем массиве будут переопределены):
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)
Мне любопытно, почему последовательный поток не перезаписывает элементы массива, как это делает параллельный поток. Я немного искал и не мог найти документацию по этому поводу, но я предполагаю, что он существует где-то.
Функция generator
требуется для создания "нового массива желаемого типа и предоставленной длины ". Если вы не соблюдаете спецификацию, поведение не определено.