一、问题描述
PageHelper.startPage(1, 10);
List<Data> datas = dataService.finddataList();
// 使用stream处理数据
dataList = datas.stream().xxxxx;
return new PageInfo<>(dataList);
如上,如果使用Stream处理datas,那经过分页返回的数据中total最大值就是10,无法分页,导致分页失效。
二、问题原因剖析
我们看到pageHelper使用的时候
// 第一步:分页查询
PageHelper.startPage(1, 10);
List<Data> datas = dataService.finddataList();
// 第二步:返回PageInfo对象
return new PageInfo<>(dataList);
【第一步】:分页查询 分页查询的时候,得到的datas是一个特殊的ArrayList,Page对象,在源码中可以看到
public class Page<E> extends ArrayList<E> implements Closeable {
}
【第二步】:返回PageInfo对象
在返回PageInfo对象的时候,源码中会做如下判断
【结论】由于使用stream之后收集为了普通的ArrayList对象,并不是Page对象,所以在第二步返回时被判定为非page对象,被当做一个普通的ArrayList设置了pageNum(写死为第一页了)、total等,所以分页就失效了 stream把可正常分页的Page对象(ArrayList的子对象),转换成了不能分页的ArrayList对象
三、解决方案
把stream流处理,换成增强for循环即可
for (Data data : datas) {
xxx
}