接口代码优化

代码优化问题

1.业务需求

需要从用户表(实体类为MBDAuthorizeVo)里查出所有用户,然后通过业务id(businessId)在权限表(PermissionEntry)查出有权限的用户id,在实体类MBDAuthorizeVo中有权限的标记hasPermission为True,默认都为False

2.原本代码

实习的时候, 脑子一抽写下了以下代码, 各位是否发现了什么问题

  	@Override
	public List<MBDAuthorizeVo> getIdWithPermission(String businessId) {
        List<Object> userIdList = new ArrayList<>();
        if (StringUtils.isNotBlank(businessId)) {
            LambdaQueryWrapper<PermissionEntry> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(PermissionEntry::getBusinessId, businessId);
            queryWrapper.select(PermissionEntry::getAuthorizeId);
            userIdList = entryMapper.selectObjs(queryWrapper);  //通过业务id查出权限表内对应的用户id
        }
        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        List<MBDAuthorizeVo> voList = sysBaseAPI.getAuthorizeUser(loginUser.getCompanycode());  //获取所有的用户数据
        if (userIdList == null || userIdList.isEmpty()) {
            return voList; //若权限表查不到对应的用户id,则所有数据均未授权,直接返回
        } else {
            for (MBDAuthorizeVo vo : voList) {
                if (userIdList.contains(vo.getAuthorizeId())) {
                    vo.setHasPermission(true); //有权限的标记为True
                }
            }
            return voList;
        }
    }
3.分析问题(今天review代码一看,这啥呀,一顿分析)
  • 减少方法体内变量的作用域,这样当它们不再需要时,就可以更快地被垃圾收集器回收。
  • 使用Collection.isEmpty()来检查集合是否为空,这比用null检查更加安全且语义更清晰。
  • 避免在一个大的if-else块中进行逻辑操作。可以先返回一个条件,这样就可以减少嵌套的深度并提高代码的可读性。
4.修改代码
  • userIdList的创建移动到if条件内部,因为只有在businessId不为空时我们才需要这个集合。
  • 将查询结果userIdList转换成Set<Object>,用于查找操作,因为在集合中查找元素时,Set的性能比List更优。
  • 简化了if-else逻辑,先检查businessId是否为空,如果为空直接返回voList,减少了不必要的查询和逻辑判断。这样做可以减少代码复杂度,降低认知负荷,让代码更易于阅读和维护。
public List<MBDAuthorizeVo> getIdWithPermission(String businessId) {
    LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
    List<MBDAuthorizeVo> voList = sysBaseAPI.getAuthorizeUser(loginUser.getCompanycode());

    if (StringUtils.isBlank(businessId)) {
        return voList;
    }

    LambdaQueryWrapper<PermissionEntry> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(PermissionEntry::getBusinessId, businessId).select(PermissionEntry::getAuthorizeId);
    List<Object> userIdList = entryMapper.selectObjs(queryWrapper);

    if (userIdList.isEmpty()) {
        return voList;
    }

    Set<Object> userIdSet = new HashSet<>(userIdList);
    for (MBDAuthorizeVo vo : voList) {
        if (userIdSet.contains(vo.getAuthorizeId())) {
            vo.setHasPermission(true);
        }
    }
    return voList;
}
5.各位大佬是否有更好的修改建议呢?? 求个点赞支持么么哒(๑•́₃•̀๑)
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值