开发中Stream流小妙用
Java开发中Stream流小妙用
今天给大家分享下我个人在开发中常用的Stream流用法。
业务如下:
根据公司的id,查询用户信息。
- 公司表结构:
CREATE TABLE `company` (
`id` int(7) NOT NULL AUTO_INCREMENT COMMENT '公司id',
`company_name` varchar(30) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '公司名称',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`is_delete` tinyint(1) unsigned zerofill DEFAULT NULL COMMENT '是否删除:0否,1是',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
- 人员表结构
CREATE TABLE `person` (
`id` int(7) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`person_name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '姓名',
`age` int(3) DEFAULT NULL COMMENT '年龄',
`sex` tinyint(1) DEFAULT NULL COMMENT '性别:1男,2女',
`id_card_no` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '身份证号',
`company_id` int(7) DEFAULT NULL COMMENT '所属公司id',
`department_id` tinyint(1) DEFAULT NULL COMMENT '部门id',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`is_delete` tinyint(1) unsigned zerofill DEFAULT NULL COMMENT '是否删除:0否,1是',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
- 部门表结构
CREATE TABLE `department` (
`id` int(7) NOT NULL COMMENT '部门id',
`department_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '部门名称',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`is_delete` tinyint(1) unsigned zerofill DEFAULT NULL COMMENT '是否删除:0否,1是',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
省略controller,serive
seriveImpl如下:
@Override
public List<PersonInfoVo> getPersonInfoData(PersonInfoParam param) {
// 参数检验
if (ObjectUtils.isEmpty(param.getCompanyId())) {
return new ArrayList<>();
}
// 查询人员信息
LambdaQueryWrapper<PersonPo> personLqw = new LambdaQueryWrapper<>();
personLqw.eq(PersonPo::getCompanyId, param.getCompanyId());
personLqw.eq(ObjectUtils.isEmpty(param.getSex()), PersonPo::getSex, param.getSex());
personLqw.eq(ObjectUtils.isEmpty(param.getDepartmentId()), PersonPo::getDepartmentId, param.getDepartmentId());
personLqw.eq(PersonPo::getIsDelete, 0);
List<PersonPo> personPoList = personMapper.selectList(personLqw);
// 校验数据
if (CollectionUtils.isEmpty(personPoList)) {
return new ArrayList<>();
}
// 查询部门信息
LambdaQueryWrapper<DepartmentPo> departmentLqw = new LambdaQueryWrapper<>();
departmentLqw.eq(DepartmentPo::getId, param.getDepartmentId());
departmentLqw.eq(DepartmentPo::getIsDelete, 0);
List<DepartmentPo> departmentPoList = departmentMapper.selectList(departmentLqw);
// 将项目信息转成map集合
Map<Integer, String> companyPoMap = departmentPoList
.stream().collect(Collectors.toMap(DepartmentPo::getId, DepartmentPo::getDepartmentName));
// 数据处理
return personPoList.stream().map(po -> {
PersonInfoVo vo = new PersonInfoVo();
BeanUtils.copyProperties(po, vo);
vo.setPersonId(po.getId());
vo.setCompanyId(param.getCompanyId());
vo.setCompanyName(companyPoMap.get(po.getCompanyId()));
return vo;
}).collect(Collectors.toList());
}
这里用到了stream流将查询到的部门信息转换成了以部门id为key,部门名称为value,再用map.get()方法,就可以避免双重for循环处理数据了啦,大家可以根据自己的实际业务改变哦。
需要注意的是:map.get()方法,会存在空指针异常,需要做好代码健壮性判断。
开发小白见解。欢迎大家交流哦!!!