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]