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()
));
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集合
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集合中对象嵌套子集,对子集进行过滤分组
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()));
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;
}));