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
相关产品推荐
相关产品推荐

