使用java stream对集合中的对象按指定字段进行分组统计并排序

一、概述

有这样一个需求,在一个list集合中的对象有相同的name,我需要把相同name的对象的total进行汇总计算,并且根据total倒序排序。使用java stream来实现这个需求,这里做一个记录,希望对有需求的同学提供帮助。

二、根据对象指定字段分组排序

使用java stream 计算的过程如下图:


image.png

下面是实现的代码示例:

/**
 * 定义一个对象,这里使用了lombok的注解
 */
@Data
@Accessors(chain = true)
class Good {
    private String name;
    private Integer total;
}

public class Test4 {
    public static void main(String[] args) {

        List list = new ArrayList<>();
        // 创建几个对象放在list集合中
        list.add(new Good().setName("xiaomi").setTotal(2));
        list.add(new Good().setName("huawei").setTotal(2));
        list.add(new Good().setName("apple").setTotal(2));
        list.add(new Good().setName("xiaomi").setTotal(2));


        List collect1 = list.stream()
                // 根据name进行分组
                .collect(Collectors.groupingBy(Good::getName))
                .entrySet()
                .stream()
                .map(entry -> {
                    String key = entry.getKey();
                    List value = entry.getValue();
                    Integer sum = value.stream().mapToInt(Good::getTotal).sum();
                    return new Good().setName(key).setTotal(sum);
                })
                // 根据total倒序排序
                .sorted(Comparator.comparing(Good::getTotal).reversed())
                .collect(Collectors.toList());
        System.out.println(collect1.toString());
    }
}

输出结果如下:


image.png

你可能感兴趣的:(使用java stream对集合中的对象按指定字段进行分组统计并排序)