簡體   English   中英

串聯兩個數組流時出現ArrayStoreException

[英]ArrayStoreException when concatenating two arrays Stream

我正在關注這個問題 ,並試圖獲得一種連接兩個數組的新方法。

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:我看過處理 ArrayStoreException並相信我的問題由不可組合類型的流組成,這就是為什么不存儲它們的原因,所以兩個問題有所不同。

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);
Stream.of(c, d)

Stream<int[]> 您不能將int[]元素存儲在Integer[]

使用IntStream.concat代替:

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

Stream<int[]>上的.flatMap(Stream::of)返回Stream<int[]> (因為Stream.of(int[])將執行Stream<T> of(T t)而不是Stream<T> of(T... values) )。 因此,這些元素不能存儲在Integer[]數組中。

您可以改為使用IntStream

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM