串联两个数组流时出现ArrayStoreException

时间:2019-02-26 08:18:57

标签: java java-8

我一直遵循这个Question,并试图获得一种连接两个数组的新方法。

int[] c = {1, 34};
int[] d = {3, 1, 5};

我想到了这一点:

 Integer [] res= Stream.of(c, d)
                .flatMap(Stream::of)
                .toArray(Integer[]::new);

以上编译正常,但出现此异常:

Exception in thread "main" java.lang.ArrayStoreException
    at java.lang.System.arraycopy(Native Method)
    at java.util.stream.SpinedBuffer.copyInto(SpinedBuffer.java:194)
    at java.util.stream.Nodes$SpinedNodeBuilder.copyInto(Nodes.java:1290)
    at java.util.stream.SpinedBuffer.asArray(SpinedBuffer.java:215)
    at java.util.stream.Nodes$SpinedNodeBuilder.asArray(Nodes.java:1296)
    at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:439)

我的错误是什么,请给我一个解释,以便我理解这个概念。

PS:我见过Dealing with an ArrayStoreException,并相信我的问题由不可组合类型的流组成,这就是为什么它们不被存储的原因,所以两个问题是不同的。

3 个答案:

答案 0 :(得分:4)

Stream.of将输入数组视为单个元素。请改用Arrays.stream()

int[] c = {1, 34};
int[] d = {3, 1, 5};

int[] res= Stream.of(c, d)
  .flatMapToInt(Arrays::stream)
  .toArray();

  for (int re : res) {
      System.out.println(re);
  }

结果:

1
34
3
1
5

如果要装箱,请继续:

Integer[] res= Stream.of(c, d)
  .flatMapToInt(Arrays::stream).boxed()
  .toArray(Integer[]::new);

答案 1 :(得分:3)

Stream.of(c, d)

Stream<int[]>。您不能在int[]中存储Integer[]元素。

改为使用IntStream.concat

IntStream.concat(IntStream.of(c), IntStream.of(d)).boxed()
   .toArray(Integer[]::new);

答案 2 :(得分:3)

.flatMap(Stream::of)上的

Stream<int[]>返回Stream<int[]>(因为Stream.of(int[])将执行Stream<T> of(T t)而不是Stream<T> of(T... values))。因此,这些元素不能存储在Integer[]数组中。

您可以改为使用IntStream s:

int [] res= Stream.of(c, d)
                  .flatMapToInt (IntStream::of)
                  .toArray();