背景
用得非常多的一个分页实体对象
说明
只是一种抽象的思路, 可能不一定能够直接使用, 慎用.
只是一种抽象的思路, 可能不一定能够直接使用, 慎用.
只是一种抽象的思路, 可能不一定能够直接使用, 慎用.
分页实体
@Data
public class PageEntity<T> {/*** 分页后的结果*/private List<T> entityList;/*** 总计行数*/private long totalSize;/*** 有参构造** @param entityList 数据集合* @param totalSize 总数*/public PageEntity(List<T> entityList, long totalSize) {this.entityList = entityList;this.totalSize = totalSize;}/*** 带分页参数的PageEntity构造器** @param entityList 待分页数据* @param offset 偏移量* @param rows 页大小*/public PageEntity(List<T> entityList, int offset, int rows) {offset = Math.max(offset, 0);rows = Math.min(rows, entityList.size());this.entityList = entityList.stream().skip(offset).limit(rows).collect(Collectors.toList());this.totalSize = entityList.size();}/*** 无参构造*/public PageEntity() {this.entityList = new ArrayList<>();this.totalSize = 0;}/*** 基于内存的分页** @param entityList 带分页的集合* @param pageSize 页容量* @param currnetPage 当前页* @return 分页后的实体对象* @param <T> 对象实体泛型*/public static <T> PageEntity<T> page(List<T> entityList, int pageSize, int currnetPage) {if (pageSize < 1 || currnetPage < 1) {throw new IllegalArgumentException("currentPage or pageSize can`t less than 1");}// 分页int beginIndex = (currnetPage - 1) * pageSize;int totalSize = entityList.size();if (beginIndex < 0) {beginIndex = 0;} else if (beginIndex >= totalSize) {// 规避如下情况: 一开始有那么多数据, 在用户正在查看的时候正好没有了, 那么这时跳转到最后一页beginIndex = (totalSize - pageSize > 0 ? (totalSize - totalSize % pageSize) : 0);}int endIndex = Math.max(beginIndex + pageSize, totalSize);// 防止 endIndex 过大变为负数endIndex = Math.max(endIndex, 0);List<T> data = entityList.subList(beginIndex, endIndex);return new PageEntity<>(data, totalSize);}
}