最近在忙着自己的毕业设计,在使用PageImpl
进行分页的时候,发现传入的list数据需要自己进行分割,然后总结了一下记在这里。
了解List.subList(int fromIndex, int toIndex)方法
在进行切割List的时候,我们需要了解一下List.subList(int fromIndex, int toIndex)
的方法,它返回的元素位置的范围是[fromIndex, toIndex)
即不包括toIndex
位置的元素,如下图
开始分割List
比如,有get(List list, Integer page, Integer limit)
这样的一个方法,其中list
是我们需要分割的数据,page
是我们传入的当前页数,limit
是每一页的元素容量。
现在我们传入一个长度为10的list
,需要返回第一页数据并且limit
是5,
下图中start
是当前页面的第一个元素的位置;end
是包含第一页最后一个元素的分割位置, end = start + 本页的元素容量
;list.subList(start, end)
是我们需要的结果。
现在我们依然传入一个长度为10的list
,但需要返回最后一页并且limit
是5,
下图中start + 本页的元素容量 = 10
,到目前end = start + 本页元素个数
是没有问题的。
但是当我们传入一个长度为9的list
,需要返回最后一页并且个数是limit
是5,
那么,下图中start + 本页的元素容量 = 10
,而list
的索引最大是9,这时list.subList(start, end)
方法会报错,所以,这时的end = list.size()
。
总结
通过上面分析,我们知道了end = Math.min(start + 本页的元素容量, list.size())
,那么相应的代码也就出来了。
public <T> Page<T> get(List list, Integer page, Integer limit) {
Pageable pageable = PageRequest.of(page - 1, limit);
// 需要自行切割 list
// 当前页第一条数据在List中的位置
int start = (int) pageable.getOffset();
/*
*下一页第一条数据在List中的位置, 包含第一页最后一个元素的分割位置 = 当前这页的第一条数据的位置 + 当页的数据容量,而每页的分割位置不可能超过源数据的总条数
* 所以,取它们两者的最小值
*/
int end = Math.min((start + pageable.getPageSize()), list.size());
return new PageImpl<T>(list.subList(start, end), pageable, list.size());
}