概述
a0= a0,
a1= a0 + a1,
a2= a1 + a2…
有位兄台提醒我了, 我把业务说一下.
场景是我需要给echart的折线图赋数据.
LineDto是一个有两个字段的Dto.
Date(月份),
Count(值).
每月(Date)显示的是当月的数值(Count).
现在是需求变了, 每月显示的是累加的数值, 就是当月之前的数值也累加到当前Count上.
所以我想到的是先查询出来后,
1月, a0 = 1月的Count,
2月, a1 = a0 + 2月的Count,
3月, a2 = a1 + a2,
….
我是用for循环实现的, 但是我强迫症总想用stream的相关api来实现, 所以问问各位兄台有没有例子我学习一下.
if(CollectionUtils.isNotEmpty(result)){
LineDto dto = new LineDto();
dto.setGemBoardCount(0);
for (LineDto i : result) {
i.setGemBoardCount(i.getGemBoardCount() + dto.getGemBoardCount());
dto = i;
}
}
我想问下, 可以用stream的collectors.reducing实现么, 谢谢
回答
y1s1哈,题主你这个稍微归纳总结一下嘛。。。不然非得让我们回答的人来理解你什么XXXCount的业务字段啊。。。万一看错了,导致最终提供的方法也就错了哦~
不过我自己理解下来,觉得你就是希望把一个List合并成一个LineDto,合并的要求是,某些数字字段(就是你那些XXXCount)分别相加合并
因为是某些字段,题主是XXXCount,那我就简化为num1,num2这样好看点的字段,如果明白我的思路,到时候题主自行转换一下就行了
那我把LineDto定义为:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LineDto {
private int num1;
private int num2;
}
那提供一个List,我们进行合并操作,这里也不一定非要用collectors.reducing吧。。。咋的,是瞧不起咱们stream自带的reduce方法么?哈哈哈哈,开玩笑,自带明显比collectors.reducing少写几个字母嘛,程序员捡懒,我就按照stream.reduce来举例了哈
List result = new ArrayList<>();
result.add(new LineDto(1, 20));
result.add(new LineDto(2, 30));
LineDto lineDto = result.stream().reduce(new LineDto(), LineDto::merge);
不过真非要用collectors.reducing也行,不过他们效果一样
LineDto reduce = result.stream().collect(Collectors.reducing(new LineDto(), LineDto::merge));
这里reduce操作中第二个参数我用了LineDto::merge,这是一个额外方法,其实就是把LineDto合并操作抽取出来,我是写在了LineDto中,当然你也可以写在其他地方
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LineDto {
private int num1;
private int num2;
public LineDto merge(LineDto newLineDto) {
this.num1 = this.num1 + newLineDto.getNum1();
this.num2 = this.num2 + newLineDto.getNum2();
return this;
}
}
其实merge方法也没有多复杂,就是按照业务需求,把相应的字段进行合并即可
当然如果你为了LineDto的纯净简单性,不需要有这类业务代码耦合,那你可以写在其他地方,比如
public class LineDtoHelper {
public static LineDto merge(LineDto dto1, LineDto dto2) {
dto1.setNum1(dto1.getNum1() + dto2.getNum1());
dto1.setNum2(dto1.getNum2() + dto2.getNum2());
return dto1;
}
}
那调用的时候就需要改为:
LineDto lineDto = result.stream().reduce(new LineDto(), LineDtoHelper::merge);
其实也很简单吧,题主可以去玩玩试试~拜了个拜~(๑•̀ㅂ•́)و✧
最后
以上就是平淡小鸭子为你收集整理的streamset 数据合并_java List 相邻两个数据累加,可以用stream的collectors.reducing实现么...的全部内容,希望文章能够帮你解决streamset 数据合并_java List 相邻两个数据累加,可以用stream的collectors.reducing实现么...所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复