分组计算
使用场景:
在一个list中,根据某字段进行分组,进行不同组内数据的计算,
@Data
public class order implements Serializable {private static final long serialVersionUID = 7353320757077145027L;
/**
* 指令id
*/
private String id;/**
* 净值
*/
private BigDecimal net;//略
}
/**
* 1.根据传入的数据集与指定的分组字段进行分组
* 2.分组完成后对指定的字段进行计算
* 3.返回一个新的数据集
*
* @param dataList 需要分组的数据集合
* @param groupFunc 分组字段
* @return List<order>
*/
private List<order> groupParamList(List<order> dataList, Function<order, ?> groupFunc) {
return dataList.stream().collect(Collectors.groupingBy(
groupFunc
)).values().stream().flatMap(list -> Stream.of(list.stream().reduce((data1, data2) -> {
data1.setPrizeCount(data1.getNet().add(data2.getNet());
return data1;
}).orElse(new order()))).collect(Collectors.toList());
}@Test
public void groupParamList() {
order order = new order();
order.setId(1);
order.setNet(new BigDecimal("1"));order order2 = new order();
order2.setId(1);
order2.setNet(new BigDecimal("2"));
List<order> dataList = new ArrayList<>();
dataList.add(order);
dataList.add(order2);log.info("分组前---");
dataList.forEach(data -> {
log.info(data.toString() + "\n");
});List<order> dataListNew = groupParamList(dataList, order::getId());
log.info("分组后---");
dataListNew.forEach(data -> {
log.info(data.toString() + "\n");
});
}