JpaPageUtils.java 工具类

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

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;

public class JpaPageUtils {
	
	private static Integer defaultPageSize = 10;

	public static <T> Page<T> listToPage(List<T> list, int pageNo) {
		PageRequest pageable = PageRequest.of(pageNo - 1, defaultPageSize);
		return getPage(list, pageable);
	}
	
	public static <T> Page<T> listToPage(List<T> list, int pageNo, int pageSize) {
		PageRequest pageable = PageRequest.of(pageNo - 1, pageSize);
		return getPage(list, pageable);
	}
	
	public static <T> Page<T> getPage(List<T> list) {
		PageRequest pageable = PageRequest.of(0, defaultPageSize);
		return getPage(list, pageable);
	}

	public static <T> Page<T> getPage(List<T> list, Pageable pageable) {
		// 第n页起始值
		int pageStart = pageable.getPageNumber() * pageable.getPageSize();
		// 第n页期望结尾值
		int expectPageEnd = pageStart + pageable.getPageSize() - 1;
		return Optional.of(list.size()).filter(size -> size >= pageStart)
				.map(size -> getRealSubList(pageStart, expectPageEnd, list, pageable))
				.orElseGet(() -> getEmptySubList(list, pageable));
	}

	private static <T> PageImpl<T> getRealSubList(int pageStart, int expectPageEnd, List<T> list, Pageable pageable) {
		int realPageEnd = (list.size() > expectPageEnd) ? expectPageEnd + 1	: list.size();
		return new PageImpl<>(list.subList(pageStart, realPageEnd), pageable, list.size());
	}

	private static <T> PageImpl<T> getEmptySubList(List<T> list, Pageable pageable) {
		return new PageImpl<>(new ArrayList(), pageable, list.size());
	}

}


Page接口

public interface Page<T> extends Iterable<T> {
 
    int getNumber();			//当前第几页   返回当前页的数目。总是非负的
 
    int getSize();				//返回当前页面的大小。包括表头信息之类
 
    int getTotalPages();         //返回分页总数。
 
    int getNumberOfElements();   //返回当前页上的元素数。
 
    long getTotalElements();    //返回元素总数。
 
    boolean hasPreviousPage();  //返回如果有上一页。
 
    boolean isFirstPage();      //返回当前页是否为第一页。
 
    boolean hasNextPage();      //返回如果有下一页。
 
    boolean isLastPage();       //返回当前页是否为最后一页。
 
    Iterator<T> iterator();
 
    List<T> getContent();     //将所有数据返回为List
 
    boolean hasContent();     //返回数据是否有内容。
 
    Sort getSort();          //返回页的排序参数。
}