使用PageImpl自定义分页功能

使用PageImpl自定义分页功能

Amiron 258 2019-09-06

最近在忙着自己的毕业设计,在使用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());
    }

# Java