1. 通过taskId分组计算其分组的数量 ,并通过filter过滤掉taskId为空的数据再分组
Map<Long, Long> taskIdCountMap = modelStashList.stream()
.filter(item -> item.getTaskId()!= null)
.collect(Collectors.groupingBy(ModelStashVo::getTaskId, Collectors.counting()));
2. 获取到的map集合里的分组后的数量放到另一个List集合对象中
思维链:遍历stream流,看map中的taskIdr如果与List中的taskId相同则设置count数量值
modelStashList = modelStashList.stream()
.peek(ele -> {
if (taskIdCountMap.containsKey(ele.getTaskId())) {
ele.setCount(taskIdCountMap.get(ele.getTaskId()).intValue());
}
}).collect(Collectors.toList());
3.通过taskId进行分组
Map<Long, List<ModelStashVo>> collect = modelStashList.stream().collect(Collectors.groupingBy(ModelStashVo::getTaskId));
4. Stream流遍历分组后的数据并进行格式组装
List<ModelStashListVo> modelStashListVos = new LinkedList<>();
collect.forEach((key,value)->{
ModelStashListVo modelStashListVo =new ModelStashListVo();
modelStashListVo.setTaskId(key);
modelStashListVo.setTaskName(value.get(0).getTaskName());
modelStashListVo.setCount(value.size());
modelStashListVo.setModelStashList(value);
modelStashListVos.add(modelStashListVo);
});
问题记录,原本我是通过两个sql来进行查询的然后进行循环嵌套查数据库,后面整合下sql成一条
数据格式用Stream流遍历获取到后组装返回给前端展示
源代码如下:
/**
* 查询模型仓库列表-数据分组展示
*
* @return 模型仓库集合
*/
@Override
public List<ModelStashListVo> queryModelStashList(){
/** 查询分组对应的count & title数据 */
List<ModelStashVo> modelStashList = modelStashMapper.queryModelStashList();
/** 过滤掉taskId为空的数据 */
Map<Long, Long> taskIdCountMap = modelStashList.stream()
.filter(item -> item.getTaskId()!= null)
.collect(Collectors.groupingBy(ModelStashVo::getTaskId, Collectors.counting()));
/** 遍历设置count数量值并赋值-并将map中的id值赋值给list中的id值 */
modelStashList = modelStashList.stream()
.peek(ele -> {
if (taskIdCountMap.containsKey(ele.getTaskId())) {
ele.setCount(taskIdCountMap.get(ele.getTaskId()).intValue());
}
}).collect(Collectors.toList());
Map<Long, List<ModelStashVo>> collect = modelStashList.stream().collect(Collectors.groupingBy(ModelStashVo::getTaskId));
/** 构建返回的数据 */
List<ModelStashListVo> modelStashListVos = new LinkedList<>();
collect.forEach((key,value)->{
ModelStashListVo modelStashListVo =new ModelStashListVo();
modelStashListVo.setTaskId(key);
modelStashListVo.setTaskName(value.get(0).getTaskName());
modelStashListVo.setCount(value.size());
modelStashListVo.setModelStashList(value);
modelStashListVos.add(modelStashListVo);
});
return modelStashListVos;
}
先记录到这,感慨下Stream流真的很方便,以后多多记录!