java8 stream自定义分组求和并排序的实现
作者:shuangyueliao 时间:2022-09-12 04:08:26
本文主要介绍了java8 stream自定义分组求和并排序的实现,分享给大家,具体如下:
public static void main(String[] args) {
List<GroupDetailDTO> list = new ArrayList<>();
GroupDetailDTO dto1 = new GroupDetailDTO();
dto1.setHeadsetId(1);
dto1.setTime("2020-01-03");
dto1.setActConcreteTime("a");
dto1.setPlayed(1);
list.add(dto1);
GroupDetailDTO dto2 = new GroupDetailDTO();
dto2.setHeadsetId(1);
dto2.setTime("2020-01-01");
dto2.setActConcreteTime("b");
dto2.setPlayed(1);
list.add(dto2);
GroupDetailDTO dto3 = new GroupDetailDTO();
dto3.setHeadsetId(1);
dto3.setTime("2020-01-02");
dto3.setActConcreteTime("c");
dto3.setPlayed(1);
list.add(dto3);
GroupDetailDTO dto4 = new GroupDetailDTO();
dto4.setHeadsetId(2);
dto4.setTime("2020-01-01");
dto4.setActConcreteTime("d");
dto4.setPlayed(4);
list.add(dto4);
Map<GroupDetailDTO, Integer> collect = list.stream().collect(Collectors.groupingBy(o -> new GroupDetailDTO(o.getHeadsetId(), o.getTime()), TreeMap::new, Collectors.summingInt(o -> o.getPlayed())));
collect.forEach((k, v) -> {
System.out.println(k + "@@@" + v);
});
}
@Data
public class GroupDetailDTO implements Comparable<GroupDetailDTO> {
private Integer headsetId;
private String actConcreteTime;
private String time;
private Integer played;
public GroupDetailDTO() {
}
public GroupDetailDTO(Integer headsetId, String time) {
this.headsetId = headsetId;
this.time = time;
}
@Override
public int compareTo(GroupDetailDTO o) {
String a = this.headsetId + "|" + this.getTime();
String b = o.getHeadsetId() + "|" + o.getTime();
return a.compareTo(b);
// return this.getTime().compareTo(o.gtTime());
}
}
结果:
上述代码实现对对象GroupDetailDTO按设备和时间分组求played的和,并且按时间排序了。当初想着既然是按时间排序那么compareTo方法直接使用
return this.getTime().compareTo(o.getTime());
但是结果不正确
分析:分组求和时如果使用了排序,那么分组时对相同属性的合并将直接根据compareTo返回的结果合并对象,所以如果用上述方法将产生相同的时间直接合并,而不是new GroupDetailDTO(o.getHeadsetId(), o.getTime())里面的两个属性都相同才合并。
来源:https://segmentfault.com/a/1190000021644561
标签:java8,stream,分组,求和,排序
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
使用Nexus搭建Maven私服教程的方法步骤
2023-03-05 18:56:58
![](https://img.aspxhome.com/file/2023/3/66203_0s.jpg)
java ReentrantLock条件锁实现原理示例详解
2023-12-12 02:36:13
![](https://img.aspxhome.com/file/2023/8/66508_0s.png)
springboot搭建访客管理系统的实现示例
2023-09-02 13:10:41
![](https://img.aspxhome.com/file/2023/3/58463_0s.png)
java对ArrayList排序代码示例
2023-11-24 20:14:21
SpringBoot整合mybatis-generator-maven-plugin的方法
2022-08-14 18:34:22
windows定时器配置执行java jar文件的方法详解
2023-04-17 16:40:21
![](https://img.aspxhome.com/file/2023/4/61544_0s.png)
MapTask工作机制图文详解
2021-12-13 11:03:27
![](https://img.aspxhome.com/file/2023/1/65771_0s.png)
spring Bean创建的完整过程记录
2022-04-14 03:57:51
![](https://img.aspxhome.com/file/2023/0/71180_0s.jpg)
Android集成Flutter
2023-07-06 13:07:33
![](https://img.aspxhome.com/file/2023/0/101830_0s.jpg)
IDEA 2021.2 激活教程及启动报错问题解决方法
2023-11-14 14:10:27
![](https://img.aspxhome.com/file/2023/5/59345_0s.png)
解析c#在未出现异常情况下查看当前调用堆栈的解决方法
2023-05-18 02:54:04
C#日期格式强制转换方法(推荐)
2022-09-19 10:24:57
合并有序数组的实现(java与C语言)
2023-08-16 13:45:40
Java实现画线、矩形、椭圆、字符串功能
2022-12-30 19:24:33
![](https://img.aspxhome.com/file/2023/0/72590_0s.jpg)
SpringMVC实现表单验证功能详解
2023-09-24 09:07:28
![](https://img.aspxhome.com/file/2023/4/72554_0s.gif)
mybatis中resultMap 标签的使用教程
2022-01-15 11:19:42
![](https://img.aspxhome.com/file/2023/3/68533_0s.png)
Winform让DataGridView左侧显示图片
2021-09-24 03:50:38
![](https://img.aspxhome.com/file/2023/3/78173_0s.jpg)
springboot返回值转成JSONString的处理方式
2022-09-27 12:04:46
解析Java和Eclipse中加载本地库(.dll文件)的详细说明
2023-11-11 01:23:31
SpringBoot分离打Jar包的两种配置方式
2023-01-30 09:06:59