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

Java中对自定义对象使用Reduce操作实现双字段求和

使用Reduce实现POJO字段总和计算

我来帮你搞定这个用reduce替代mapToInt计算总和的问题~先回顾下你的原始代码定义:

1. 原始POJO类与对象列表

class Pojo {
    public Pojo(int a, int b) {
        super();
        this.a = a;
        this.b = b;
    }
    int a;
    int b;
    public int getA() { return a; }
    public void setA(int a) { this.a = a; }
    public int getB() { return b; }
    public void setB(int b) { this.b = b; }
}

Pojo object1 = new Pojo(1, 1);
Pojo object2 = new Pojo(2, 2);
Pojo object3 = new Pojo(3, 3);
Pojo object4 = new Pojo(4, 4);
List<Pojo> pojoList = new ArrayList<>();
pojoList.add(object1);
pojoList.add(object2);
pojoList.add(object3);
pojoList.add(object4);

2. 原IntStream实现方式

你之前用mapToInt的写法是完全没问题的,它把每个Pojo对象转换成a+b的int值,再求和:

int sum = pojoList.stream()
                  .mapToInt(ob -> (ob.getA() + ob.getB()))
                  .sum();

3. 正确的Reduce实现方案

要改用reduce的话,有两种常见写法,核心是定义好累加逻辑:

写法一:带初始值的reduce(推荐,支持并行流)

这种方式需要传入初始值、累加器函数(把当前总和和下一个对象的a+b相加),以及组合器函数(并行流时合并不同线程的结果):

int sum = pojoList.stream()
                  .reduce(0, 
                          (total, pojo) -> total + pojo.getA() + pojo.getB(),
                          (sum1, sum2) -> sum1 + sum2);
  • 0是初始总和值
  • 第二个参数是累加器:每次将当前累计的total和当前Pojo对象的a+b相加
  • 第三个参数是组合器:当使用并行流时,用来合并多个子任务的计算结果

写法二:无初始值的reduce

如果不需要并行流,也可以用无初始值的版本,返回OptionalInt(避免空列表时出现空指针问题):

OptionalInt sumOptional = pojoList.stream()
                                  .mapToInt(pojo -> pojo.getA() + pojo.getB())
                                  .reduce((sum1, sum2) -> sum1 + sum2);
// 用orElse处理空列表的默认值
int sum = sumOptional.orElse(0);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:47:17