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);
相关文章
|
4月前
|
人工智能 算法 大数据
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
这篇内容介绍了编程中避免使用 for 循环的一些方法,特别是针对 Python 语言。它强调了 for 循环在处理大数据或复杂逻辑时可能导致的性能、可读性和复杂度问题。
51 6
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
|
4月前
|
算法 Python
Python实现求多个集合之间并集的方法
Python实现求多个集合之间并集的方法
44 0
Python实现求多个集合之间并集的方法
|
11月前
|
人工智能
实例解释在lingo中使用集合模型
实例解释在lingo中使用集合模型
173 0
离散数学_第二章:基本结构:集合、函数、序列、求和和矩阵(1)
离散数学_第二章:基本结构:集合、函数、序列、求和和矩阵(1)
208 0
Zp
Lambda元素规约
Lambda元素规约
Zp
98 0
Lambda元素规约
|
Scala 开发者
集合化简介绍和案例 | 学习笔记
快速学习集合化简介绍和案例
集合化简介绍和案例 | 学习笔记
|
Python
列表解析(推导)
列表解析(推导)
81 0
|
算法 C++
STL常用算数生成与常用集合算法
STL常用算数生成与常用集合算法
103 0
STL常用算数生成与常用集合算法