前言
在日常的开发工作中,会遇到很多不确定的需求场景,无法使用第三方提供的分页组件来实现,那么如何自己实现一个简单的分页工具类呢?
工具类
第一版本:
java
@Setter
@Getter
public class PageTool<T> {
/**
* 当前页数
*/
private int pageNum;
/**
* 每页的记录条数
*/
private int pageSize;
/**
* 总记录数
*/
private int total;
/**
* 总页数
*/
private int pages;
/**
* 当前开始值
*/
private int start;
/**
* 总记录数
*/
private List<T> list;
public PageTool(List<T> list) {
this.total = list.size();
this.list = list;
}
public void startPage(int pageNum, int pageSize) {
// 1、获取总记录数和分页数
this.pageNum = pageNum;
this.pageSize = pageSize;
this.pages =
total % pageSize == 0 ?
(total / pageSize) :
(total / pageSize) + 1;
// 2、根据分页信息切割当前页数据
int begin = (pageNum - 1) * pageSize;
int end = pageNum * pageSize;
// 判断list的大小是否在起始点的以上,并且判断是否比end大
if ( list.size() > begin ) {
if ( list.size() <= end ) {
end = list.size();
}
list = list.subList(begin, end);
}
}
}
在看到这些if-else判断和三目运算符,瞬间想起来,Math
运算类貌似提供了一些比较大小的函数,为何不使用一下呢,于是乎我确定优化一下分页的方法,
优化
Math.ceil()
向上取整来获取总页数
Math.min()
获取最小值来判断截取数组的结束节点。
于是乎改造一下:
java
@Setter
@Getter
public class PageTool<T> {
/**
* 当前页数
*/
private int pageNum;
/**
* 每页的记录条数
*/
private int pageSize;
/**
* 总记录数
*/
private int total;
/**
* 总页数
*/
private int pages;
/**
* 当前开始值
*/
private int start;
/**
* 总记录数
*/
private List<T> list;
public PageTool(List<T> list) {
this.total = list.size();
this.list = list;
}
public void startPage(int pageNum, int pageSize) {
// 1、获取总记录数和分页数
this.pageNum = pageNum > 0 ? pageNum : 10;
this.pageSize = pageSize > 0 ? pageNum : 1;
this.pages = (int) Math.ceil( (double) this.total / pageSize);
// 2、根据分页信息切割当前页数据
int startIndex = (pageNum - 1) * pageSize;
int endIndex = Math.min(pageNum * pageSize, list.size());
list = list.subList(startIndex, endIndex);
}
}
一个简单、人畜无害的工具类就诞生啦。