Java开发中Stream流小妙用

开发中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()方法,会存在空指针异常,需要做好代码健壮性判断。

开发小白见解。欢迎大家交流哦!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值