一个通用的分页实体对象的思考

背景

用得非常多的一个分页实体对象

说明

只是一种抽象的思路, 可能不一定能够直接使用, 慎用.
只是一种抽象的思路, 可能不一定能够直接使用, 慎用.
只是一种抽象的思路, 可能不一定能够直接使用, 慎用.

分页实体

@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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值