解决pageInfo对象经过stream处理后分页属性异常

博客讨论了在Java中使用PageInfo对象进行分页时,经过stream处理导致分页属性异常的问题。分析了源码,指出当数据集合不是Page类型时,分页属性会被硬编码。解决方案是避免使用stream,改用增强for循环以保持分页信息的正确性。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

PageInfo 对象经过stream处理会导致分页属性异常

错误代码:

在这里插入图片描述

debug进行分析:

​ 1、注意这里,在没进行stream流处理时,数据list是一个正常的可分页Page类型的集合List
在这里插入图片描述
2、在经过了stream流处理后返回的List已经改表了,不具有分页的属性了,就是一个普通的ArrayList;现在就大概可以找到pageInfo对象分页属性失效的原因了,下面去源码里找找原因在这里插入图片描述

​ 3、源码分析

public PageInfo(List<T> list, int navigatePages) {
        super(list);
        this.isFirstPage = false;
        this.isLastPage = false;
        this.hasPreviousPage = false;
        this.hasNextPage = false;
        if (list instanceof Page) {  //1、 会判断是否为Page对象类型 若是则正常返回分页属性
            Page page = (Page)list;
            this.pageNum = page.getPageNum();
            this.pageSize = page.getPageSize();
            this.pages = page.getPages();
            this.size = page.size();
            if (this.size == 0) {
                this.startRow = 0L;
                this.endRow = 0L;
            } else {
                this.startRow = page.getStartRow() + 1L;
                this.endRow = this.startRow - 1L + (long)this.size;
            }
        } else if (list instanceof Collection) { 
            //2、非Page对象,则pageNum固定为1,以及pageSize为集合大小
            this.pageNum = 1;
            this.pageSize = list.size();
            this.pages = this.pageSize > 0 ? 1 : 0;
            this.size = list.size();
            this.startRow = 0L;
            this.endRow = list.size() > 0 ? (long)(list.size() - 1) : 0L;
        }

        if (list instanceof Collection) {
            this.calcByNavigatePages(navigatePages);
        }

    }

​ 4、通过源码就可以发现如果数据data集合为非Page类型,则其分页属性会被写死,进而导致分页属性失效

解决方式

将stream流处理,换成增强for循环即可

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值