当前位置 主页 > 服务器问题 > Linux/apache问题 >

    java8 stream自定义分组求和并排序的实现

    栏目:Linux/apache问题 时间:2020-01-28 21: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())里面的两个属性都相同才合并。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持IIS7站长之家。

几何思维:基于并查集的六度分隔理论的验证与实现 JacobDale:小白的经典CNN复现(二):LeNet-5 费弗里:(数据科学学习手札104)Python+Dash快速web应用开发― 易波叶平:【ELK】elastalert 日志告警 肖哥哥:Zabbix监控虚拟机服务-告警与自动恢复 高德技术:高德地图驾车导航内存优化原理与实战 月图灵:postgres模糊匹配大杀器 theMine:Mybatis执行流程学习之手写mybatis雏形 MCTW:从手写三层循环到标准实现,矩阵相乘运行效率提高三万六千 Grey Zeng:apijson简单使用 云服务器规格选型 远程桌面连接win系统发生身份验证错误,要求的函数不受支持解决办法 win8系统发生身份验证错误,要求的函数不受支持解决办法 linux远程拷贝到另一个机器文件? linux远程工具有哪些,常用的远程连接Linux工具有哪些? Linux远程管理常见工具PuTTY和SecureCRT对比 linux远程复制文件夹命令进行远程拷贝文件的 scp命令 linux远程复制 linux远程复制拷贝命令使用实例 windows上好用的ssh工具,Windows下连接Linux的三款好用的ssh工具 windows下ssh工具 windows如何ssh远程登录Linux设置免密登录和别名 windows ssh远程登录,windows如何使用ssh登录ubuntu Visual Studio Code(VS Code)查询PostgreSQL拓展安装教程图解 java 如何判断是否是26个英文字母 Vscode上使用SQL的方法 SpringBoot快速迁移至Quarkus的方法步骤 详解Flutter 调用 Android Native 的方法 xftp xshell,Linux下Xshell的安装和 Xftp的安装 mac下怎么安装go语言 介绍python的函数装饰器