Java 8 суммирует все значения двух внутренних массивов друг с другом

int[] ar1 = {1,2,3};
int[] ar2 = {1,2,3};

Вывод:

{2,3,4,3,4,5,4,5,6}

Я пробовал что-то вроде этого:

IntStream.range(0,ar1.length).map(x -> IntStream.range(0,ar2.length).map(y -> ar1[y]+ar2[x]));

но это не работает:

Несоответствие типов: невозможно преобразовать из IntStream в int.

Как я могу суммировать каждое значение ar1 с каждым значением ar2 в Java 8 с использованием потоков?

Ответы

Ответ 1

Вы должны использовать flatMap, поскольку ожидается, что map of IntStream сопоставляет каждый элемент int исходного IntStream с int, а не с IntStream.

System.out.println(Arrays.toString (
    IntStream.range(0,ar1.length)
             .flatMap(x -> IntStream.range(0,ar2.length).map(y -> ar1[x]+ar2[y]))
             .toArray ()));

Вывод:

[2, 3, 4, 3, 4, 5, 4, 5, 6]

В качестве альтернативы созданию IntStream индексов массива вы можете создать IntStream элементов массива:

System.out.println(Arrays.toString (
    Arrays.stream(ar1)
          .flatMap(x -> Arrays.stream(ar2).map(y -> x + y))
          .toArray ()));

Ответ 2

Для каждого i -го элемента вы можете создать IntStream сумм i + j этого элемента и j -го элемента другого массива:

IntStream.of(ar1).flatMap(i -> IntStream.of(ar2).map(j -> i + j)).toArray();

Я бы не рекомендовал использовать потоки индексов (IntStream.range(0,ar1.length)), где они могут быть заменены самими потоками самих значений (IntStream.of(ar1)).

Ответ 3

Помимо IntStream # flatMap, вы можете использовать массивы #stream (int []) для создания IntStream. например:

int[] sum = Arrays.stream(ar1)
                  .flatMap(left -> Arrays.stream(ar2).map(right -> left + right))
                  .toArray();

System.out.println(Arrays.toString(sum));
//                        ^--- [2, 3, 4, 3, 4, 5, 4, 5, 6]