list 分组_java8 stream自定义分组求和并排序

    public static void main(String[] args) {        List 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 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);        });    }
@Datapublic class GroupDetailDTO implements Comparable {    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());    }}

结果:

6aa49353ae68082661386b9f7f7ffed0.png

上述代码实现对对象GroupDetailDTO按设备和时间分组求played的和,并且按时间排序了。当初想着既然是按时间排序那么compareTo方法直接使用
return this.getTime().compareTo(o.getTime());
但是结果不正确

6a496711df4e4e48bb18238a650f1099.png

分析:分组求和时如果使用了排序,那么分组时对相同属性的合并将直接根据compareTo返回的结果合并对象,所以如果用上述方法将产生相同的时间直接合并,而不是new GroupDetailDTO(o.getHeadsetId(), o.getTime())里面的两个属性都相同才合并。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值