Если вы хотите получить сумму всех целых чисел в массивах, вы можете сделать это следующим образом:
int sumOfAll = Stream.of(arr1, arr2, arr3)
.flatMap(Arrays::stream)
.mapToInt(v -> v)
.sum();
Если вам нужен список с суммой целых чисел в данной позиции, то вы можете сделать это следующим образом. Вычислить максимальную длину в массивах и затем использовать ее для вставки значения по умолчанию, если текущий список слишком мал.
int max = Stream.of(arr1, arr2, arr3).mapToInt(a -> a.length).max().getAsInt();
List<Integer> reduce = Stream.of(arr1, arr2, arr3)
.map(a -> Stream.of(a).collect(toList()))
.reduce((a, b) -> IntStream.range(0, max)
.mapToObj(i -> (i < a.size() ? a.get(i) : 0) + (i < b.size() ? b.get(i) : 0))
.collect(toList()))
.get();
ОБНОВЛЕНИЕ
Если вы хотите добиться того, что вы показали во втором примере, тогда можно сделать как ниже.
- Создать
List<List<Integer>>
, который собирает все необходимые для суммирования числа. - Выполните операцию суммирования для каждого списка.
List<List<Integer>> integersList = Stream.of(arr11, arr12, arr13)
.map(a -> Stream.of(a).map(x -> Arrays.asList(x)).collect(toList()))
.reduce((a, b) -> b.stream().flatMap(v -> a.stream()
.map(x -> {
ArrayList<Integer> ints = new ArrayList<>(x);
ints.add(v.get(0));
return ints;
}
)
).collect(toList())
).get();
Это дает:
[[2, 2, 2], [4, 2, 2], [5, 2, 2], [2, 4, 2], [4, 4, 2 ], [5, 4, 2], [2, 5, 2], [4, 5, 2], [5, 5, 2], [2, 2, 4], [4, 2, 4], [5, 2, 4], [2, 4, 4], [4, 4, 4], [5, 4, 4], [2, 5, 4], [4, 5, 4], [5 , 5, 4], [2, 2, 5], [4, 2, 5], [5, 2, 5], [2, 4, 5], [4, 4, 5], [5, 4 , 5], [2, 5, 5], [4, 5, 5], [5, 5, 5]]
Затем суммируя это:
List<Integer> sum = integersList.stream()
.map(a -> a.stream().reduce(Integer::sum).get())
.sorted().collect(toList());
Конечный результат:
[6, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12 , 12, 13, 13, 13, 14, 14, 14, 15]