list通过流根据属性去重,并且累加特定属性

文章展示了如何使用Java处理数据库查询结果,通过对GoodsProjectDBEntity实体类的goodsCode属性进行分组,将相同goodsCode的项目进行聚合,合并计划数量和未到货数量。这涉及到集合操作、流处理和构造器的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先来实体类

@Data
@Table(name = "goods_project")
@NoArgsConstructor
@AllArgsConstructor
public class GoodsProjectDBEntity {

    @Id
    private Long id;

    private String goodsCode; // 物资编码,对应goods_detail中的goods_code

    private String projectCode; // 计划批号,对应计划表中的project_code

    private String goodsName; // 物资名称

    private String goodsPrec; // 物资规格

    private String goodsUnit; // 物资单位

    private String goodsPrice; // 系统价

    private String goodsReferencePrice; // 参考价

    private Integer projectCount; // 计划数量

    private Integer lastMonthStockCount; // 上月库存量

    private Integer threeMonthAverageCount; // 三个月库存量

    private String note; // 备注

    private String fieldArea; // 场区

    private String goodsUsage; // 用法

    private String supportCompany; // 供应商

    private String buyFormCode; // 对应采购单

    private Integer surplusProjectCount; // 未到货的数量

    private String goodsType; // 商品类别

    private Long goodsTypeNumber;

    private Long warehouseId; //计划表对应的仓库

    @Transient // 实体类中有字段,但是数据库中没有
    private String serialNumber; // 商品编号

    @Transient // 实体类中有字段,但是数据库中没有
    private String name; // 计划数量所在名字
}

之后上代码操作

List<GoodsProjectDBEntity> goodsProjectDBEntities = goodsProjectDBMapper.selectByExample(example);
        if (CollectionUtils.isNotEmpty(goodsProjectDBEntities)) {
            // 把goodsCode一样的视为同一种,则计划数量增加,未到货数量增加
            List<GoodsProjectDBEntity> add = new ArrayList<>();
            goodsProjectDBEntities.parallelStream()
                    .collect(Collectors.groupingBy(GoodsProjectDBEntity::getGoodsCode, Collectors.toList())).forEach(
                    (id, transfer) -> {
                        transfer.stream()
                                .reduce((a, b) -> new GoodsProjectDBEntity(
                                        null,
                                        a.getGoodsCode(),
                                        null,
                                        a.getGoodsName(),
                                        a.getGoodsPrec(),
                                        a.getGoodsUnit(),
                                        a.getGoodsPrice(),
                                        a.getGoodsReferencePrice(),
                                        a.getProjectCount() + b.getProjectCount(),
                                        a.getLastMonthStockCount(),
                                        a.getThreeMonthAverageCount(),
                                        a.getNote(),
                                        a.getFieldArea(),
                                        a.getGoodsUsage(),
                                        a.getSupportCompany(),
                                        a.getBuyFormCode(),
                                        a.getSurplusProjectCount() + b.getSurplusProjectCount(),
                                        a.getGoodsType(),
                                        a.getGoodsTypeNumber(),
                                        null,
                                        a.getSerialNumber(),
                                        a.getName()))
                                .ifPresent(add :: add);
                    });
            return Result.success().addData("vaccineProjects", add);
        }

先根据属性group by分组,然后进行属性赋值(需要实体类有对应构造方法)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值