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);
相关文章
|
2月前
|
人工智能 算法 大数据
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
这篇内容介绍了编程中避免使用 for 循环的一些方法,特别是针对 Python 语言。它强调了 for 循环在处理大数据或复杂逻辑时可能导致的性能、可读性和复杂度问题。
38 6
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
|
2月前
|
算法 Python
Python实现求多个集合之间并集的方法
Python实现求多个集合之间并集的方法
23 0
Python实现求多个集合之间并集的方法
|
4月前
|
机器学习/深度学习 PyTorch 算法框架/工具
pytorch中非标量调用backward()的时候为什么要先进行sum操作
在《动手学深度学习》第二版教程中,当y为非标量的时候,调用backward()函数时,为什么先要求和呢(即y.sum().backward()),估计很多读者有点懵,今天小编给大家说说我的理解。
289 3
|
9月前
|
人工智能
实例解释在lingo中使用集合模型
实例解释在lingo中使用集合模型
113 0
|
10月前
|
C++ Python
使用C++实现Range序列生成器
在C++编程中,经常需要迭代一系列数字或其他可迭代对象。通常,这需要编写复杂的循环结构,但有一种精妙的方法可以使这一过程变得更加简单和可读。如果你使用过Python语言那么一定对Range语句非常的数据,我们可以使用C++来实现一个简单的Range封装,如下代码定义了一个名为Range的命名空间,其中包含一个RangeImpl类和相关的函数,用于生成指定范围内的数值序列。这序列生成器支持指定开始值、结束值和可选步长,确保生成的序列满足指定的条件。此代码简化了迭代数值序列的过程,提高了代码的可读性和可维护性,适用于处理不同数据类型的序列。
49 0
离散数学_第二章:基本结构:集合、函数、序列、求和和矩阵(1)
离散数学_第二章:基本结构:集合、函数、序列、求和和矩阵(1)
169 0
Zp
Lambda元素规约
Lambda元素规约
Zp
93 0
Lambda元素规约
|
Scala 开发者
集合化简介绍和案例 | 学习笔记
快速学习集合化简介绍和案例
集合化简介绍和案例 | 学习笔记
|
Windows
L2-005 集合相似度(vector、set求并交集)
L2-005 集合相似度(vector、set求并交集)
103 0