ArrayStoreException при объединении двух массивов Stream - PullRequest
0 голосов
/ 26 февраля 2019

Я следил за этим Вопросом и пытался найти новый способ объединения двух массивов.

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 и считаю, что мой вопрос состоит из потока, которыенесовместимые типы, поэтому они не сохраняются, поэтому два вопроса разные.

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

.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();
0 голосов
/ 26 февраля 2019

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);
0 голосов
/ 26 февраля 2019
Stream.of(c, d)

является Stream<int[]>.Вы не можете хранить int[] элементы в Integer[].

. Вместо этого используйте IntStream.concat:

IntStream.concat(IntStream.of(c), IntStream.of(d)).boxed()
   .toArray(Integer[]::new);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...