最强分页类实现PageHelper的PageInfo

735 阅读1分钟
import lombok.Data;
import lombok.ToString;

import java.util.ArrayList;
import java.util.List;

/**
 * 分页对象
 *
 * @author xiaoxiong
 */
@Data
@ToString
public class PageInfo<T> {
    public static final int DEFAULT_NAVIGATE_PAGES = 8;
    private long total;
    private int pageNum;
    private int pageSize;
    private int size;
    private long startRow;
    private long endRow;
    private int pages;
    private int prePage;
    private int nextPage;
    private boolean isFirstPage;
    private boolean isLastPage;
    private boolean hasPreviousPage;
    private boolean hasNextPage;
    private int navigatePages;
    private int[] navigatepageNums = new int[0];
    private int navigateFirstPage;
    private int navigateLastPage;
    private List<T> list = new ArrayList<>();

    public PageInfo(List<T> list, int pageNum, int pageSize, long count) {
        this(list, pageNum, pageSize, count, 8);
    }

    public PageInfo(List<T> list, int pageNum, int pageSize, long count, int navigatePages) {
        if (pageSize < 1) {
            return;
        }
        if (pageNum < 1) {
            return;
        }
        if (count < 1) {
            return;
        }
        this.pageSize = pageSize;
        this.total = count;
        this.pages = (int) (this.total % this.pageSize > 0 ? this.total / this.pageSize + 1 : this.total / this.pageSize);
        this.pageNum = Math.min(pageNum, pages);
        this.size = list.size();
        if (this.size == 0) {
            this.startRow = 0L;
            this.endRow = 0L;
        } else {
            this.startRow = (long) this.pageNum * this.pageSize - this.pageSize + 1;
            this.endRow = this.startRow - 1L + (long) this.size;
        }
        this.prePage = this.pageNum > 1 ? this.pageNum - 1 : 1;
        this.nextPage = (long) (this.pageNum - 1) * pageSize + this.size < this.total ? this.pageNum + 1 : pages;
        this.isFirstPage = this.pageNum == 1;
        this.isLastPage = this.nextPage == this.pageNum;
        this.hasPreviousPage = this.prePage < this.pageNum;
        this.hasNextPage = this.nextPage > this.pageNum;
        this.navigatePages = navigatePages;
        int[] navigatepageNums = new int[pages];
        for (int i = 0; i < pages; i++) {
            navigatepageNums[i] = i + 1;
        }
        this.navigatepageNums = navigatepageNums;
        this.navigateFirstPage = this.navigatepageNums.length > 0 ? this.navigatepageNums[0] : 0;
        this.navigateLastPage = this.navigatepageNums.length > 0 ? this.navigatepageNums[navigatepageNums.length - 1] : 0;
        this.list = list;
    }

    public static int firstResult(int pageNum, int pageSize) {
        int firstResult = pageNum * pageSize - pageSize;
        return Math.max(firstResult, 0);
    }

    public static int maxResult(int pageSize) {
        return Math.max(pageSize, 0);
    }

}