记录一次java8分组再计算的应用
List<SmSku> tableData = smOrder.getTableData();
List<SmSku> categoryList = new ArrayList<>();
//按批次分组
tableData.parallelStream().collect(Collectors.groupingBy(o ->o.getRealCategoryChName(),Collectors.toList())).forEach(
(id, transfer) ->{
transfer.stream().reduce((a,b) -> new SmSku(a.getNumber()+b.getNumber(),a.getRealCategoryName(),a.getRealCategoryChName())).ifPresent(categoryList::add);
});
根据某一个字段去重得出一个集合
//定义list集合
List<String> boxNos = packageInfoParam.getDetails().stream().map(SaicItemDetail::getBoxNo).distinct().collect(Collectors.toList());
利用TreeSet 集合不重复的特性 ,分组筛选重复的,得出一个新集合
ArrayList<SaicItemDetail> collect = packageInfoParam.getDetails().stream().collect(Collectors.collectingAndThen(Collectors.toCollection(
() -> new TreeSet<>(Comparator.comparing(o -> o.getBoxNo()))),
ArrayList::new));
筛选出同样元素的数据,数量进行累加
//先根据sku+行号 分组
Map<String, List<SaicItemDetail>> skuAndLineNoGroupCollectMap= packageInfoParam.getDetails().stream().collect(Collectors.groupingBy(o -> o.getItemCode() + "_" + o.getLineNo()));
//把相同的行号和sku数量 相加
List<SaicItemDetail> addUpCollect = skuAndLineNoGroupCollectMap.keySet().stream().map(u -> {
BigDecimal sum = Convert.toBigDecimal(skuAndLineNoGroupCollectMap.get(u).stream().mapToDouble(i -> Convert.toDouble(i.getPackQty())).sum());
//这里和上面一样的原理,也会影响原list集合中的被指向的地址的对象数据
SaicItemDetail itemDetail = skuAndLineNoGroupCollectMap.get(u).get(0);
itemDetail.setPackQty(sum.toString());
return itemDetail;
}).collect(Collectors.toList());