Java8 Stream流导致PageHelper失效问题及解决

835 阅读1分钟

一、问题描述

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对象的时候,源码中会做如下判断 image.png

【结论】由于使用stream之后收集为了普通的ArrayList对象,并不是Page对象,所以在第二步返回时被判定为非page对象,被当做一个普通的ArrayList设置了pageNum(写死为第一页了)、total等,所以分页就失效了 stream把可正常分页的Page对象(ArrayList的子对象),转换成了不能分页的ArrayList对象

三、解决方案

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

for (Data data : datas) {
  xxx
}