lamda整合两个集合整合

简介: 在使用PageHelper分页工具时,出现统计total异常,或者分页的其他参数有问题,网上有了不少帖子,要么查两次,要么写好mybatis映射。当然mybatis映射我一开始就写好了不起作用。最终还是查两次数据库。

微信截图_20220401093214.png
代码
第一次是在获取page前就查好想要的,然后再查询单表,对应一致就好

//3、查询-PageHelper带有子集的SQL查询总数映射有问题
//3-1 获取全部用户以及角色
List<SysUser> list1 = sysUserService.getAllUserByConditions(departNames,userName,realName,jobNumber);
PageHelper.startPage(pageNum, pageSize);
List<SysUser> list = sysUserService.getAllUserToPageHelper(departNames,userName,realName,jobNumber);
//3-2 将单表获取的与带角色的匹配,在转移过来
//法一:将list1 中对应的直接全部转为新list覆盖原list
list = list.stream().map(mapper->
    list1.stream()
    .filter(predicate-> predicate.getUserId() == mapper.getUserId())
    .findFirst().orElse(null)
).collect(Collectors.toList());
//法二:将list1 中对应的role集合复制到list的role空集合中
list.forEach(action->{action.setRoles(
    list1.stream()
    .filter(user-> user.getUserId() == action.getUserId())
    .map(user -> user.getRoles()).findFirst().get()
);});
PageInfo<SysUser> pageInfo = new PageInfo<SysUser>(list);
//3-3 总是仍要为全部的,配置后的只显示当前页的条数
pageInfo.setTotal(list1.size());

两种方法,第一种就是讲第二个list中的对象全部转化为第一个list中的数据,第二种是只将对应的数据赋值到对应的数据中,都可以实现,看你心情
注:
PageInfo中的总数依旧有问题,只有当前页数据的总数,显然是不对的,还需在单独修改一下。
总结
这样写毕竟不是在根源解决,PageHelper没有去研究,有哪位大神知道的可以交流一下。
还有对于lamda的使用还是不是很熟练,总感觉会有更好的方式,毕竟这样和两次for循环没啥区别,只是代码简洁一些而已。
补充解决方案:
重写page对象:


/**
     * 分页处理
     * 目前 前端已处理跳转页超出范围问题,此处不再处理
     * @param <T> 泛型对象
     * @param pageNum 当前页码
     * @param pageSize 每页显示条数
     * @param list 全部数据集
     * @return
     */
    public static <T> PageInfo<T> getPageInfo(int pageNum, int pageSize,List<T> list) {
        //1、创建Page类
        Page<T> page = new Page<T>(pageNum, pageSize);
        //2、为Page类中的total属性赋值
        int total = list.size();
        page.setTotal(total);
        //3、计算当前需要显示的数据下标起始值
        int startIndex = (pageNum - 1) * pageSize;
        int endIndex = Math.min(startIndex + pageSize,total);
        //4、从链表中截取需要显示的子链表,并加入到Page
        if (total > startIndex) {
            page.addAll(list.subList(startIndex,endIndex));
        }else {
            page.addAll(list);
        }
        //5、以Page创建PageInfo
        PageInfo<T> pageInfo = new PageInfo<T>(page);
        return pageInfo;
    }

PageInfo<SysUser> pageInfo = PagehelperUtil.getPageInfo(pageNum, pageSize, list);
相关文章
|
7月前
|
测试技术 数据库 索引
联合迭代器与生成器,enumerate() 内置函数真香!
联合迭代器与生成器,enumerate() 内置函数真香!
47 1
|
5月前
|
人工智能 算法 大数据
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
这篇内容介绍了编程中避免使用 for 循环的一些方法,特别是针对 Python 语言。它强调了 for 循环在处理大数据或复杂逻辑时可能导致的性能、可读性和复杂度问题。
59 6
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
使用推导式和生成器创建数组
使用推导式和生成器可以便捷创建数组。例如,`[n^2 for n in 1:10]` 生成一个包含平方数的向量,而 `[n*m for n in 1:10, m in 1:10]` 创建一个乘积矩阵。无括号形式如 `n^2 for n in 1:5` 产生生成器,需要 `collect` 转换为数组。另外,表达式 `sum(1/n^2 for n=1:1000)` 求和而不占用大量内存。
|
7月前
|
机器学习/深度学习 PyTorch 算法框架/工具
pytorch中非标量调用backward()的时候为什么要先进行sum操作
在《动手学深度学习》第二版教程中,当y为非标量的时候,调用backward()函数时,为什么先要求和呢(即y.sum().backward()),估计很多读者有点懵,今天小编给大家说说我的理解。
424 3
Python函数每日一讲 - frozenset集合函数入门及实例
Python函数每日一讲 - frozenset集合函数入门及实例
【面向对象的三大特征以及迭代器生成器】
【面向对象的三大特征以及迭代器生成器】
38 0
离散数学_第二章:基本结构:集合、函数、序列、求和和矩阵(1)
离散数学_第二章:基本结构:集合、函数、序列、求和和矩阵(1)
226 0
Lambda 实战-两个不同的集合合并成一个新的集合
Lambda 实战-两个不同的集合合并成一个新的集合