Java8中stream的map和group by的使用
实际使用中,经常遇到一个for循环里面,会有去查询数据库,为了防止这个动作,可以提前将要查询的数据查询出来,然后通过stream中的map.get(key)的方式去匹配对应
代码如下,可做参考:
// 第一种是map<String,Object>
List<WorkstationGroup> workstationGroupList = workstationGroupMapper.selectList(new LambdaQueryWrapper<>()); Map<String, WorkstationGroup> groupMap =
workstationGroupList.stream().collect(Collectors.toMap(WorkstationGroup::getGroupId,WorkstationGroup -> WorkstationGroup));
for (WorkstationCenterSuperior vo : centerSuperiors) {
WorkstationGroup workstationGroup = groupMap.get(vo.getGroupId());
if (ObjectUtils.isNotEmpty(workstationGroup)){
vo.setGroupName(workstationGroup.getGroupName());
}
}
// 第二种是map<String,List<Object>>
List<WorkstationCenter> workstationCenters = centerMapper.selectList(new LambdaQueryWrapper<>()); // 查询出数据库的数据
Map<String, List<WorkstationCenter>> listMap =
workstationCenters.stream().collect(Collectors.groupingBy(WorkstationCenter::getGroupId,
Collectors.mapping(WorkstationCenter -> WorkstationCenter, Collectors.toList()))); //通过stream转换为map的形式
groupList = groupList.stream().peek(e ->{ // 利用peek进行遍历处理
// 工作中心
List<WorkstationCenter> workstationCenter = listMap.get(e.getGroupId());
List<WorkstationCenterVo> workstationCenterVos = BeanUtil.copyToList(workstationCenter, WorkstationCenterVo.class);
if (CollUtil.isNotEmpty(workstationCenterVos)){
e.setCenterVoList(workstationCenterVos);
}
}).collect(Collectors.toList());
以下为源码:
List<String> groupIdList = centerQuery.getGroupIdList(); if (CollUtil.isEmpty(groupIdList)){ return BaseResponse.fail("分组id不能为空"); } // 查询工作站 LambdaQueryWrapper<WorkstationGroup> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(WorkstationGroup::getGroupId,groupIdList); List<WorkstationGroup> workstationGroups = workstationGroupMapper.selectList(queryWrapper); List<WorkstationGroupCenterVo> groupList = BeanUtil.copyToList(workstationGroups, WorkstationGroupCenterVo.class); if (CollUtil.isEmpty(groupList)){ return BaseResponse.fail("数据为空"); } // 查询工作站下工作中心 LambdaQueryWrapper<WorkstationCenter> wrapper = new LambdaQueryWrapper<>(); wrapper.in(WorkstationCenter::getGroupId,groupIdList); List<WorkstationCenter> workstationCenters = centerMapper.selectList(wrapper); List<WorkstationGroupCenterVo> CenterVos = BeanUtil.copyToList(workstationCenters, WorkstationGroupCenterVo.class); if (CollUtil.isNotEmpty(CenterVos)){ List<String> centerIds = workstationCenters.stream().map(WorkstationCenter::getCenterId).collect(Collectors.toList()); // 查询上级工作中心 LambdaQueryWrapper<WorkstationCenterSuperior> lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.in(WorkstationCenterSuperior::getCenterId,centerIds); List<WorkstationCenterSuperior> workstationCenterSuperiors = centerSuperiorMapper.selectList(lambdaQueryWrapper); // Map<String, List<WorkstationCenterSuperior>> superiorMap = workstationCenterSuperiors.stream().collect(Collectors.groupingBy(WorkstationCenterSuperior::getCenterId, Collectors.mapping(WorkstationCenterSuperior -> WorkstationCenterSuperior, Collectors.toList()))); // List<WorkstationGroup> workstationGroupList = workstationGroupMapper.selectList(new LambdaQueryWrapper<>()); Map<String, WorkstationGroup> groupMap = workstationGroupList.stream().collect(Collectors.toMap(WorkstationGroup::getGroupId, WorkstationGroup -> WorkstationGroup)); List<WorkstationCenter> workstationCenterList = centerMapper.selectList(new LambdaQueryWrapper<>()); Map<String, WorkstationCenter> centerMap = workstationCenterList.stream().collect(Collectors.toMap(WorkstationCenter::getCenterId, WorkstationCenter -> WorkstationCenter)); // Map<String, List<WorkstationCenter>> listMap = workstationCenters.stream().collect(Collectors.groupingBy(WorkstationCenter::getGroupId, Collectors.mapping(WorkstationCenter -> WorkstationCenter, Collectors.toList()))); // 匹配 groupList = groupList.stream().peek(e ->{ // 工作中心 List<WorkstationCenter> workstationCenter = listMap.get(e.getGroupId()); List<WorkstationCenterVo> workstationCenterVos = BeanUtil.copyToList(workstationCenter, WorkstationCenterVo.class); if (CollUtil.isNotEmpty(workstationCenterVos)){ //工作中心的父级 workstationCenterVos = workstationCenterVos.stream().peek(j->{ List<WorkstationCenterSuperior> centerSuperiors = superiorMap.get(j.getCenterId()); if (CollUtil.isNotEmpty(centerSuperiors)){ List<WorkstationCenterSuperiorVo> workstationCenterVoList = new ArrayList<>(); for (WorkstationCenterSuperior vo : centerSuperiors) { WorkstationCenter center = centerMap.get(vo.getParentCenterId()); if (ObjectUtils.isNotEmpty(center)){ WorkstationCenterSuperiorVo workstationCenterSuperiorVo = BeanUtil.copyProperties(center, WorkstationCenterSuperiorVo.class); //查询分组名称 WorkstationGroup workstationGroup = groupMap.get(center.getGroupId()); if (ObjectUtils.isNotEmpty(workstationGroup)){ workstationCenterSuperiorVo.setGroupName(workstationGroup.getGroupName()); } workstationCenterVoList.add(workstationCenterSuperiorVo); } } j.setCenterSuperiorVos(workstationCenterVoList); } }).collect(Collectors.toList()); e.setCenterVoList(workstationCenterVos); } }).collect(Collectors.toList()); } // 查询工作站下的调整 return BaseResponse.ok(groupList);
以上内容,纯属个人工作笔记,作为记录,防止后面忘记,随时查看使用!