以下是我写的 Java 内存分页工具类,可以直接使用。如有 Bug,欢迎评论指点!
PageUtil.java
package com.cnblogs.cikai;
import com.cnblogs.cikai.BaseInfoBean;
import java.util.ArrayList;
import java.util.List;
/**
* 内存分页工具类
*
* @author cikai <cikai0923@foxmail.com>
* @date 02/27/2020
*/
public class PageUtil {
// 默认第 1 页
private final static Integer DEFAULT_PAGE = 1;
// 默认每页 10 条
private final static Integer DEFAULT_ROWS = 10;
/**
* 分页实现
*
* @param bean,参数主体,包含page(页数)和rows(条数)
* @param dataList,待分页数据集合
* @return 分页后的数据
*/
public static Object paging(BaseInfoBean bean, List<? extends BaseInfoBean> dataList) {
int start = 0;
int end = 0;
if (bean.getRows() == null) {
bean.setRows(DEFAULT_ROWS);
}
if (bean.getPage() == null) {
bean.setPage(DEFAULT_PAGE);
} else {
start = (bean.getPage() - 1) * bean.getRows();
}
end = Math.min((bean.getPage() * bean.getRows()), dataList.size());
if (start < 0 || end < 0) {
return new ArrayList<>();
}
if (start < end) {
return dataList.subList(start, end);
}
return new ArrayList<>();
}
/**
* 分页转换,从 [page, rows] 转换为 [page, offset]
* <p>
* [page, rows] => [第M页,每页N条]
* [page, offset] => [每页X条,从第Y个开始]
*
* @param bean
* @return
*/
public static BaseInfoBean rowsToOffset(BaseInfoBean bean) {
BaseInfoBean pageOffset = new BaseInfoBean();
if (bean.getPage() == null) {
pageOffset.setPage(bean.getRows());
return pageOffset;
}
if (bean.getRows() == null) {
return new BaseInfoBean();
}
pageOffset.setPage(bean.getRows());
pageOffset.setOffset((bean.getPage() - 1) * bean.getRows());
if (pageOffset.getPage() < 0 || pageOffset.getOffset() < 0) {
return new BaseInfoBean();
}
return pageOffset;
}
/**
* ID分页实现
*
* @param bean,参数主体,包含page(页数)和rows(条数)
* @param ids,待分页id集合
* @return 分页后的id集合
*/
public static List<Long> pagingIds(BaseInfoBean bean, List<Long> ids) {
int start = 0;
int end = 0;
if (bean.getRows() == null) {
bean.setRows(DEFAULT_ROWS);
}
if (bean.getPage() == null) {
bean.setPage(DEFAULT_PAGE);
} else {
start = (bean.getPage() - 1) * bean.getRows();
}
end = Math.min((bean.getPage() * bean.getRows()), ids.size());
if (start < 0 || end < 0) {
return new ArrayList<>();
}
if (start < end) {
return ids.subList(start, end);
}
return new ArrayList<>();
}
}
BaseInfoBean.java
package com.cnblogs.cikai;
/**
* 业务数据基类
*
* @author cikai <cikai0923@foxmail.com>
* @date 02/27/2020
*/
public class BaseInfoBean {
/**
* 第几页
*/
private Integer page;
/**
* 每页的条数
*/
private Integer rows;
/**
* 偏移量,当页从第几条数据开始
*/
private Integer offset;
/**
* 业务数据结构定义
*/
private Object data;
// TODO: 生成 Getter 和 Setter 方法
}