You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java Stream中对多个数组执行按元素求和操作?

实现按元素求和的流式处理方案

思路1:利用Stream的reduce操作累加列表

通过reduce方法逐个累加每个整数列表,以全0列表作为初始值,每次将当前列表与累加器的对应位置元素相加,最终得到求和结果。

// 定义自定义对象类替代原生Object,避免类型不安全操作
class DataObject {
    private List<Integer> arrayOfInts;

    public DataObject(List<Integer> arrayOfInts) {
        this.arrayOfInts = arrayOfInts;
    }

    public List<Integer> getArrayOfInts() {
        return arrayOfInts;
    }
}

public class SumDemo {
    public static void main(String[] args) {
        DataObject object1 = new DataObject(Arrays.asList(1, 1, 1));
        DataObject object2 = new DataObject(Arrays.asList(2, 2, 2));
        List<DataObject> listOfObjects = Arrays.asList(object1, object2);

        // 前置检查:确保所有列表长度一致
        boolean allSameLength = listOfObjects.stream()
                .map(obj -> obj.getArrayOfInts().size())
                .distinct()
                .count() == 1;
        if (!allSameLength) {
            throw new IllegalArgumentException("所有整数列表长度必须相同");
        }

        // 执行按元素求和
        List<Integer> result = listOfObjects.stream()
                .map(DataObject::getArrayOfInts)
                .reduce(
                    // 初始值:与输入列表长度相同的全0列表
                    listOfObjects.get(0).getArrayOfInts().stream().map(i -> 0).collect(Collectors.toList()),
                    // 累加逻辑:对应位置元素相加
                    (acc, current) -> IntStream.range(0, acc.size())
                            .mapToObj(i -> acc.get(i) + current.get(i))
                            .collect(Collectors.toList())
                )
                .orElse(Collections.emptyList());

        System.out.println(result); // 输出 [3, 3, 3]
    }
}

思路2:按索引遍历求和

直接遍历每个元素索引,对所有列表的该索引元素求和,逻辑更直观易懂。

// 承接上述DataObject类和初始化代码
List<Integer> result = IntStream.range(0, listOfObjects.get(0).getArrayOfInts().size())
        .mapToObj(index -> listOfObjects.stream()
                .map(obj -> obj.getArrayOfInts().get(index))
                .reduce(0, Integer::sum))
        .collect(Collectors.toList());

思路3:结合collectingAndThen批量处理

先将所有整数列表收集为一个列表集合,再按索引遍历求和,把两步操作合并在流处理中。

// 承接上述DataObject类和初始化代码
List<Integer> result = listOfObjects.stream()
        .map(DataObject::getArrayOfInts)
        .collect(Collectors.collectingAndThen(
                Collectors.toList(),
                lists -> IntStream.range(0, lists.get(0).size())
                        .mapToObj(i -> lists.stream()
                                .mapToInt(list -> list.get(i))
                                .sum())
                        .collect(Collectors.toList())
        ));

注意事项

  • 必须确保所有对象的整数列表长度一致,否则会抛出索引越界异常,建议添加前置检查。
  • 若存在空列表或null对象,需提前用filter过滤,比如filter(obj -> obj.getArrayOfInts() != null)。

内容的提问来源于stack exchange,提问作者Rayamon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:12:44