页面展示java 8的stream流想必小伙伴们都玩的得心应手了吧,但是最近开发模块的时候遇到个分页失效的问题,总以为是分页插件或者是前端传值的问题,最后才逮到真凶:stream;下面是复现过程…
两个月的数据量仍然只查出10条记录,下面是实现代码
public ListmeterChangelogList(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(Listlist, 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,拜拜



