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);
以上内容,纯属个人工作笔记,作为记录,防止后面忘记,随时查看使用!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)