在WEB开发过程中,分页逻辑是很常见的,因此在一个项目中开发一个功能齐全的泛型分页工具类,会使项目中所有分页逻辑都更加高效。
普遍的分页逻辑是将当前页和页面的数据条数作为入参,返回对应的部分数据。
直接上代码:
pge接口:
public interface Pageable {
/**
* 返回页码,从1开始
* @return 页码
*/
int getPage();
/**
* 返回每1页的条数
* @return 每1页的条数
*/
int getPageSize();
}
page类
@Getter
@AllArgsConstructor
public class Page<T> {
private int page;
private int pageSize;
private long total;
private List<T> list;
public static <T> Page<T> empty(Pageable pageable) {
return new Page<>(pageable.getPage(), pageable.getPageSize(), 0, Collections.emptyList());
}
}
page工具类:
public class PageUtils {
private PageUtils() {
}
public static <T> Page<T> page(Pageable pageable, List<T> rawList, Comparator<T> sort) {
if (pageable == null) {
throw new Exception("分页参数错误");
}
if (pageable.getPage() <= 0) {
throw new Exception("分页参数错误");
}
if (pageable.getPageSize() <= 0) {
throw new Exception("分页参数错误");
}
if (CollectionUtils.isEmpty(rawList)) {
return Page.empty(pageable);
}
int total = rawList.size();
int page = pageable.getPage();
int pageSize = pageable.getPageSize();
//先排好序,再做分页(正序)
rawList.sort(sort);
// 计算startIndex和endIndex
int startIndex = Math.max((page - 1) * pageSize, 0);
int endIndex = Math.min(startIndex + pageSize, total);
List<T> result = rawList.subList(startIndex, endIndex);
return new Page<>(pageable.getPage(), pageable.getPageSize(), total, result);
}
}
使用方法:
实现pageable接口:
@Builder
@Getter
static class GetXXXReq implements Pageable {
private int page;
private int pageSize;
}
实体类
@Builder
@Getter
static class Person {
private int id;
}
public class PageUtilsTest {
@Test
public void testBasic() {
List<Person> personList = new ArrayList<>();
//TODO 模拟元素
GetXXXReq req = GetXXXReq.builder().page(1).pageSize(20).build();
Page<Person> page = PageUtils.page(req, personList, Comparator.comparingLong(Person::getid));
System.out.println(page);
}
}