list分组汇总、计算

分组计算

使用场景:

在一个list中,根据某字段进行分组,进行不同组内数据的计算,

@Data
public class order implements Serializable {

    private static final long serialVersionUID = 7353320757077145027L;


    /**
     * 指令id
     */
    private String id;

    /**
     * 净值
     */
    private BigDecimal net;

    //略

}

/**
     * 1.根据传入的数据集与指定的分组字段进行分组
     * 2.分组完成后对指定的字段进行计算
     * 3.返回一个新的数据集
     *
     * @param dataList  需要分组的数据集合
     * @param groupFunc 分组字段
     * @return List<order>
     */
    private List<order> groupParamList(List<order> dataList, Function<order, ?> groupFunc) {
        return dataList.stream().collect(Collectors.groupingBy(
                groupFunc
        )).values().stream().flatMap(list -> Stream.of(list.stream().reduce((data1, data2) -> {
            data1.setPrizeCount(data1.getNet().add(data2.getNet());
            return data1;
        }).orElse(new order()))).collect(Collectors.toList());
    }

    @Test
    public void groupParamList() {
        order order = new order();
        order.setId(1);
        order.setNet(new BigDecimal("1"));

        order order2 = new order();
        order2.setId(1);
        order2.setNet(new BigDecimal("2"));

        

        List<order> dataList = new ArrayList<>();
        dataList.add(order);
        dataList.add(order2);

        log.info("分组前---");
        dataList.forEach(data -> {
            log.info(data.toString() + "\n");
        });

        List<order> dataListNew = groupParamList(dataList, order::getId());

        log.info("分组后---");
        dataListNew.forEach(data -> {
            log.info(data.toString() + "\n");
        });
    }

猜你喜欢

转载自blog.csdn.net/qq_44691484/article/details/128388839