栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

stream流导致分页失效问题处理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

stream流导致分页失效问题处理

java 8的stream流想必小伙伴们都玩的得心应手了吧,但是最近开发模块的时候遇到个分页失效的问题,总以为是分页插件或者是前端传值的问题,最后才逮到真凶:stream;下面是复现过程…

页面展示

两个月的数据量仍然只查出10条记录,下面是实现代码

public List meterChangelogList(MeterChangeVo meterChangeVo) {
        List list = logMapper.meterChangelogList(meterChangeVo);
        if (!list.isEmpty()) {
            list =list.stream().peek(item ->
                    item.setPrice(eaTicketService.priceInfo(item.getConsNo(), item.getTenantId(), item.getOrgNo()))).collect(Collectors.toList());
        }
        return list;
    }

不难发现,数据只经过stream流处理过才出现的分页失效问题,下面我们debug找一下原因

可以看到,经过查询后返回的list是一个可分页Page类型的集合,好,我们继续往下走…

经过stream流处理过后,返回的list是一个普通的ArrayList类型的集合,此时便已经失去了分页属性,下面我们去深究一下原因…

public PageInfo(List list, int navigatePages) {
        super(list);
        this.isFirstPage = false;
        this.isLastPage = false;
        this.hasPreviousPage = false;
        this.hasNextPage = false;
        // 判断集合是否为Page类型
        // 是的话转为Page对象,获取已传入的pageNum和pageSize从而实现分页
        if (list instanceof 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 = 0;
                this.endRow = 0;
            } else {
                this.startRow = page.getStartRow() + 1;
                this.endRow = this.startRow - 1 + this.size;
            }
            // 若集合不是Page类型
            // 将当前页数pageNum设为1
            // 每页记录数pageSize为集合大小
        } else if (list instanceof Collection) {
            this.pageNum = 1;
            this.pageSize = list.size();
            this.pages = this.pageSize > 0 ? 1 : 0;
            this.size = list.size();
            this.startRow = 0;
            this.endRow = list.size() > 0 ? list.size() - 1 : 0;
        }

        if (list instanceof Collection) {
            this.navigatePages = navigatePages;
            this.calcNavigatepageNums();
            this.calcPage();
            this.judgePageBoudary();
        }

    }

从源码中可以看出,分页处理会先判断集合是否为Page类型,是的话转为Page对象,获取已传入的pageNum和pageSize从而实现分页;若不是,则将当前页数pageNum设为1,每页记录数pageSize为集合大小

	protected TableDataInfo getDataTable(List list) {
        TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(HttpStatus.SUCCESS);
        rspData.setRows(list);
        rspData.setTotal(new PageInfo(list).getTotal());
        return rspData;
    }

此时不难理解为什么stream流处理过后分页失效了吧

解决方案
public List meterChangelogList(MeterChangeVo meterChangeVo) {
        List list = logMapper.meterChangelogList(meterChangeVo);
        if (!list.isEmpty()) {
        	// forEach代替stream流,不改变list的类型分页便不会失效了
            list.forEach(item->{
                item.setPrice(eaTicketService.priceInfo(item.getConsNo(), item.getTenantId(), item.getOrgNo()));
            });
        }
        return list;
    }
修改完后页面展示

okay,拜拜

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/877092.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号