對一個list列表,按照一個字段進行分組,jdk8方式很方便實現:
List<BillFeeVO> feeVOList = billFeeDao.listTotalFee(dto);
Map<Object, List<BillFeeVO>> feeGroup = feeVOList.stream().filter(item->StringUtil.isNotBlank(item.getBizOperator()))
.collect(Collectors.groupingBy(BillFeeVO::getBizOperator));
如果是按照多個字段進行分組,jdk8應該怎麼實現呢?
首先生成一個Bean,重寫equals和hashcode方法,把該Bean作爲key即可。
@Data
@Builder
private static class PickingGroupBean implements Comparable<PickingGroupBean> {
// 庫存佔用明細 相關信息 -----
// 庫位id
private Long storeLocationId;
// 庫位編碼
private String shelfOrder;
// skuId
private Long skuId;
// 批次號
private String batchNo;
// 訂單id
private Long sendOrderMainId;
// 單位id
private Long unitId;
// 庫存佔用明細 相關信息 -----
@Override
public int compareTo(PickingGroupBean o) {
return shelfOrder.compareTo(o.shelfOrder);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PickingGroupBean that = (PickingGroupBean) o;
if (!Objects.equals(storeLocationId,
that.storeLocationId)) {
return false;
}
if (!Objects.equals(skuId, that.skuId)) {
return false;
}
return Objects.equals(batchNo, that.batchNo);
}
@Override
public int hashCode() {
return Objects.hash(storeLocationId, skuId, batchNo);
}
}
//分組
private Map<PickingGroupBean, List<StockAssignDetails>> groupStockAssignDetails(WaveGroup waveGroup,
List<StockAssignDetails> stockAssignDetailsList,
Map<Long, LocationVO> locationById) {
// 1:分組
Map<PickingGroupBean, List<StockAssignDetails>> groupedSAD = new HashMap<>();
for (StockAssignDetails stockAssignDetail : stockAssignDetailsList) {
String shelfOrder = Optional.ofNullable(locationById.get(stockAssignDetail.getStoreLocationId()))
.map(LocationVO::getShelfOrder)
.orElse("");
PickingGroupBean pickingGroupBean = PickingGroupBean.builder()
.shelfOrder(shelfOrder)
.storeLocationId(stockAssignDetail.getStoreLocationId())
.skuId(stockAssignDetail.getSkuId())
.batchNo(stockAssignDetail.getBatchNo())
.sendOrderMainId(stockAssignDetail.getSendOrderMainId())
.unitId(stockAssignDetail.getUnitId())
.build();
groupedSAD.computeIfAbsent(pickingGroupBean, k -> new ArrayList<>())
.add(stockAssignDetail);
}
log.info("分組({}): {}", waveGroup.getId(), JSON.toJSONString(groupedSAD, true));
return groupedSAD;
}