streamset数据合并_javaList相邻两个数据累加,可以⽤stream
的coll。。。
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.GemBoardCount() + GemBoardCount());
dto = i;
}
}
我想问下, 可以⽤stream的ducing实现么, 谢谢
回答
y1s1哈,题主你这个稍微归纳总结⼀下嘛。。。不然⾮得让我们回答的⼈来理解你什么XXXCount的业务字段啊。。。万⼀看错了,导致最终提供的⽅法也就错了哦~
不过我⾃⼰理解下来,觉得你就是希望把⼀个List合并成⼀个LineDto,合并的要求是,某些数字字段(就是你那些XXXCount)分别相加合并
因为是某些字段,题主是XXXCount,那我就简化为num1,num2这样好看点的字段,如果明⽩我的思路,到时候题主⾃⾏转换⼀下就⾏了java stream
那我把LineDto定义为:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LineDto {
private int num1;
private int num2;
}
那提供⼀个List,我们进⾏合并操作,这⾥也不⼀定⾮要⽤ducing吧。。。咋的,是瞧不起咱们stream⾃带的reduce⽅法么?哈哈哈哈,开玩笑,⾃带明显⽐ducing少写⼏个字母嘛,程序员捡懒,我就按照duce来举例了哈
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);
不过真⾮要⽤ducing也⾏,不过他们效果⼀样
LineDto reduce = result.stream().ducing(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 + Num1();
this.num2 = this.num2 + Num2();
return this;
}
}
其实merge⽅法也没有多复杂,就是按照业务需求,把相应的字段进⾏合并即可
当然如果你为了LineDto的纯净简单性,不需要有这类业务代码耦合,那你可以写在其他地⽅,⽐如
public class LineDtoHelper {
public static LineDto merge(LineDto dto1, LineDto dto2) {
dto1.Num1() + Num1());
dto1.Num2() + Num2());
return dto1;
}
}
那调⽤的时候就需要改为:
LineDto lineDto = result.stream().reduce(new LineDto(), LineDtoHelper::merge);其实也很简单吧,题主可以去玩玩试试~拜了个拜~(··)و✧

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。