为什么我可以将并行流收集到任意大型数组而不是顺序流?

Jac*_* G. 12 java arrays java-8 java-stream

从回答这个问题开始,我遇到了一个特殊的功能.下面的代码按照我的假设工作(现有数组中的前两个值将被覆盖):

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

System.out.println(Arrays.toString(newArray));
Run Code Online (Sandbox Code Playgroud)

输出:

[7, 8, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

但是,使用顺序流尝试此操作会抛出IllegalStateException:

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

System.out.println(Arrays.toString(newArray));
Run Code Online (Sandbox Code Playgroud)

输出:

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)
Run Code Online (Sandbox Code Playgroud)

我很好奇为什么顺序流不会像并行流那样覆盖数组的元素.我搜索了一下,无法找到有关此的文档,但我认为它存在于某处.

shm*_*sel 11

generator函数需要生成"所需类型和提供长度的新数组".如果您不遵守规范,则行为未定义.

  • @ user7它属于"未定义",它**发生*工作,可能不会在下一个版本中 (6认同)