jdk1.8 stream例子

文章介绍了在Java编程中如何使用流(Stream)和Collectors对列表进行分组求和,涉及多个场景,如按网点和仓库分组、多条件分组、对象嵌套过滤等操作。

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

1.分组求和1

@Override
    public void validStock(List<GoodsStockDO> goodsStockDOS, GoodsStockQueryReqDTO queryReqDTO) {
        if (CollectionUtil.isEmpty(goodsStockDOS)) {
            return;
        }
        // 先根据网点和仓库分组
        final Map<Long, List<GoodsStockDO>> collect = goodsStockDOS.stream().collect(Collectors.groupingBy(e ->
                e.getShopId() + '-' + e.getWareId()
        ));
        // 根据每组内的list对库存件数和库存金重进行求和
        final List<GoodsStockDO> collect1 = collect.entrySet().stream().map(e ->
                e.getValue().get(0)
                        .setStockNum(e.getValue().stream().mapToInt(GoodsStockDO::getStockNum).sum())
                        .setGoldWeight(e.getValue().stream().map(GoodsStockDO::getGoldWeight).reduce(INIT_BIG_DECIMAL, BigDecimal::add))
        ).collect(Collectors.toList());
    }

2.改进:分组求和2

    @Override
    public void validStock(List<GoodsStockDO> goodsStockDOS, GoodsStockQueryReqDTO queryReqDTO) {
        if (CollectionUtil.isEmpty(goodsStockDOS)) {
            return;
        }
        final Map<Long, GoodsStockDO> skuAndStockDOS = goodsStockDOS.stream().collect(
                Collectors.toMap(GoodsStockDO::getSkuId, Function.identity(), (prev, cur) -> {
                    final GoodsStockDO goodsStockDO = new GoodsStockDO();
                    goodsStockDO.setStockNum(prev.getStockNum() + cur.getStockNum());
                    goodsStockDO.setGoldWeight(prev.getGoldWeight().add(cur.getGoldWeight()));
                    return goodsStockDO;
                }));
        final List<GoodsStockDO> goodsStockListByDTO = this.goodsStockMapper.getGoodsStockListByDTO(queryReqDTO);
        goodsStockListByDTO.forEach(e -> {
            final GoodsStockDO goodsStockDO = skuAndStockDOS.get(e.getSkuId());
            AssertUtil.isTrue(ObjectUtil.isNull(goodsStockDO), String.format("款式[%s]在库存中不存在!", e.getSkuNo()));
        });
    }

3.多条件分组后value转set集合

// 生成委外订单的key与明细值
        final Map<String, Set<String>> groupAndSkuResp = skuListBySkuNos.stream().collect(Collectors.groupingBy(e ->
                        e.getSupplierId() + "," + e.getBigClassId() + "," + e.getTextureId()
                , Collectors.mapping(SkuRespVO::getSkuNo, Collectors.toSet())));

4. list集合中对象嵌套子集,对子集进行过滤分组

// 生成委外订单的key与明细值
        final Map<String, List<OutsourcingOrderDetailRespVO>> groupHeadAndDetails = demandOrderVOList.stream()
                .flatMap(demandOrder -> demandOrder.getDetailList().stream().map(detail ->
                        this.buildOutOrderDetail(demandOrder, detail)))
                .filter(e -> e.getOutsourcingNum() > 0)
                .collect(Collectors.groupingBy(e ->
                        e.getSupplierId() + "," + e.getBigClassId() + "," + e.getTextureId()));
                        
 // private OutsourcingOrderDetailRespVO buildOutOrderDetail

5.两层list转取里层list 【flatMap】

 final List<PackRespVO> packRespVOS = packRespVOList.stream().filter(e -> BizTypeEnum.SP_GOODS_PACK.getKey().equals(e.getBizType())).collect(Collectors.toList());
        if (CollectionUtil.isEmpty(packRespVOS)) {
            return MapUtil.empty();
        }
        final List<PackDetailRespVO> packDetailRespVOS = packRespVOS.stream().flatMap(e -> e.getDetailList().stream()).collect(Collectors.toList());

5.分组后取第一个 【collect】

final Map<String, PackDetailDO> collect = packDetailDOS.stream().collect(
                Collectors.toMap(PackDetailDO::getTrayNo, Function.identity(), (t1, t2) -> t1)
        );

6.分组后返回对象属性集合 【collect】

Map<Integer, List<Integer>> collect2 = collect.stream().collect(Collectors.toMap(EntryBillDetailDO::getDemandOrderId,
                entryBillDetailDO -> Collections.singletonList(entryBillDetailDO.getDemandOrderLineNum()), (valuePre, valueCurr) -> {
                    List<Integer> union = new ArrayList<>(valuePre);
                    union.addAll(valueCurr);
                    return union;
                }));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值