java8 stream自定义分组求和并排序的实现
作者:shuangyueliao 发布时间:2022-09-12 04:08:26
标签:java8,stream,分组,求和,排序
本文主要介绍了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
0
投稿
猜你喜欢
- 在SpringMVC的入门学习中,我发现@GetMapping注解的使用要注意路径冲突问题,在网上都没找到类似我这样的情况,所以我在这里将问
- 配置Servlet的方法有俩种,分别是传统web.xml文档中部署servlet和注解方式部署servlet,下面就先一起来学习 * 解方式部
- 这篇文章主要介绍了java 读取系统Properties代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 前言在java Thread类中,我们会看到interrupt()、interrupted()及isInterrupted(),在大多数情况
- 1、maven打包Spring Boot项目的pom.xml文件中默认使用spring-boot-maven-plugin插件进行打包:&l
- 为什么要使用路由在之前我们的代码中,页面跳转使用的代码如下所示:Navigator.of(context).push( Mate
- fastjson转换对象实体@JsonProperty不生效项目场景请求第三方应用 返回json数据问题描述第三方返回的数据中,存在java
- 大家好,我是老三,Spring是我们最常用的开源框架,经过多年发展,Spring已经发展成枝繁叶茂的大树,让我们难以窥其全貌。这节,我们回归
- 使用Java的方式配置Spring我们现在要完全不使用Spring的xml配置,全权使用Java来配置Spring!JavaConfig是S
- 目录猜测可能原因问题排查问题原因总结class Main { public static void main(St
- 本文实例讲述了C#中WinForm跨线程访问控件的实现方法,分享给大家供大家参考。具体实现方法如下:1、跨线程访问控件委托和类的定义usin
- C#查看堆栈通常是在异常处理中,出现异常之后通过异常的堆栈可以很方便的得到出现这个错误的代码调用路径。这个很有用,是否可以在没有异常出现时使
- 本文实例讲述了Winform下实现图片切换特效的方法,是应用程序开发中非常实用的一个功能。分享给大家供大家参考之用。具体方法如下:本实例源自
- 1、try with catch还记得这样的代码吗?我们需要手动的关闭资源的流,不然会造成资源泄漏,因为虚拟机无法管理系统资源的关闭,必须手
- 前言一般在c++中没有使用的变量会有警告,C#中也有,在QT中我们利用Q_UNSED可以直接消除这些警告,那么我们在C#中该如何做才能消除这
- 前言很多人之前编写Java代码都是用的Eclipse,确实Eclipse是一个很好的工具,熟悉了之后用起来很方便,但是没办法,很多公司都强制
- OpenFeign介绍一开始,我们使用原生的 DiscoveryClient 发现服务和使用RestTemplate进行服务间调用,然后我们
- 一、同步问题提出线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。例如:两个线程ThreadA、ThreadB都操作同一个对
- 环境配置Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,MyEclis
- 本文实例讲述了Java实现的计时器【秒表】功能。分享给大家供大家参考,具体如下:应用名称:Java计时器用到的知识:Java GUI编程开发