001/** 002 * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). 003 * <p> 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * <p> 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * <p> 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package com.mybatisflex.core.paginate; 017 018import java.io.Serializable; 019import java.util.ArrayList; 020import java.util.Collections; 021import java.util.List; 022import java.util.function.Function; 023 024public class Page<T> implements Serializable { 025 026 private static final long serialVersionUID = 1L; 027 private static final int INIT_VALUE = -1; 028 029 private List<T> records = Collections.emptyList(); 030 private int pageNumber = INIT_VALUE; 031 private int pageSize = INIT_VALUE; 032 private long totalPage = INIT_VALUE; 033 private long totalRow = INIT_VALUE; 034 035 public static <T> Page<T> of(int pageNumber, int pageSize) { 036 return new Page<>(pageNumber, pageSize); 037 } 038 039 public static <T> Page<T> of(int pageNumber, int pageSize, long totalRow) { 040 return new Page<>(pageNumber, pageSize, totalRow); 041 } 042 043 public Page() { 044 045 } 046 047 public Page(int pageNumber, int pageSize) { 048 this.setPageNumber(pageNumber); 049 this.setPageSize(pageSize); 050 } 051 052 public Page(int pageNumber, int pageSize, long totalRow) { 053 this.setPageNumber(pageNumber); 054 this.setPageSize(pageSize); 055 this.setTotalRow(totalRow); 056 } 057 058 059 public Page(List<T> records, int pageNumber, int pageSize, long totalRow) { 060 this.setRecords(records); 061 this.setPageNumber(pageNumber); 062 this.setPageSize(pageSize); 063 this.setTotalRow(totalRow); 064 } 065 066 067 public List<T> getRecords() { 068 return records; 069 } 070 071 public void setRecords(List<T> records) { 072 if (records == null) { 073 records = Collections.emptyList(); 074 } 075 this.records = records; 076 } 077 078 public int getPageNumber() { 079 return pageNumber; 080 } 081 082 public void setPageNumber(int pageNumber) { 083 if (pageNumber < 1) { 084 throw new IllegalArgumentException("pageNumber must greater than or equal 1,current value is: " + pageNumber); 085 } 086 this.pageNumber = pageNumber; 087 } 088 089 090 public int getPageSize() { 091 return pageSize; 092 } 093 094 public void setPageSize(int pageSize) { 095 if (pageSize < 0) { 096 throw new IllegalArgumentException("pageSize must greater than or equal 0,current value is: " + pageSize); 097 } 098 this.pageSize = pageSize; 099 this.calcTotalPage(); 100 } 101 102 public long getTotalPage() { 103 return totalPage; 104 } 105 106 public void setTotalPage(long totalPage) { 107 this.totalPage = totalPage; 108 } 109 110 public long getTotalRow() { 111 return totalRow; 112 } 113 114 public void setTotalRow(long totalRow) { 115 if (totalRow < 0) { 116 throw new IllegalArgumentException("totalRow must greater than or equal 0,current value is: " + totalRow); 117 } 118 this.totalRow = totalRow; 119 this.calcTotalPage(); 120 } 121 122 /** 123 * 计算总页码 124 */ 125 private void calcTotalPage() { 126 if (totalPage == INIT_VALUE && pageSize != INIT_VALUE && totalRow != INIT_VALUE) { 127 totalPage = totalRow % pageSize == 0 ? (totalRow / pageSize) : (totalRow / pageSize + 1); 128 } 129 } 130 131 132 public <R> Page<R> map(Function<? super T, ? extends R> mapper) { 133 Page<R> newPage = new Page<>(); 134 newPage.pageNumber = pageNumber; 135 newPage.pageSize = pageSize; 136 newPage.totalPage = totalPage; 137 newPage.totalRow = totalRow; 138 139 if (records != null && !records.isEmpty()) { 140 List<R> newRecords = new ArrayList<>(records.size()); 141 for (T t : records) { 142 newRecords.add(mapper.apply(t)); 143 } 144 newPage.records = newRecords; 145 } 146 return newPage; 147 } 148 149 150 @Override 151 public String toString() { 152 return "Page{" + 153 "pageNumber=" + pageNumber + 154 ", pageSize=" + pageSize + 155 ", totalPage=" + totalPage + 156 ", totalRow=" + totalRow + 157 ", records=" + records + 158 '}'; 159 } 160}