Created
July 27, 2023 06:34
-
-
Save JonasGao/cdbe11869fd1b37308a607d9524d0de8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import com.fasterxml.jackson.annotation.JsonIgnore; | |
| import org.jetbrains.annotations.NotNull; | |
| import org.springframework.data.domain.Page; | |
| import org.springframework.data.domain.Pageable; | |
| import org.springframework.data.domain.Sort; | |
| import java.util.ArrayList; | |
| import java.util.Iterator; | |
| import java.util.List; | |
| import java.util.function.Function; | |
| public class PageData<T> implements Page<T> { | |
| private List<T> content = new ArrayList<>(); | |
| private long total = 0; | |
| private int number; | |
| private int size; | |
| public PageData() { | |
| } | |
| public PageData(List<T> list) { | |
| if (list instanceof com.github.pagehelper.Page<T> page) { | |
| this.total = page.getTotal(); | |
| this.number = page.getPageNum(); | |
| this.size = page.getPageSize(); | |
| } else { | |
| this.total = list.size(); | |
| this.number = 1; | |
| this.size = list.size(); | |
| } | |
| this.content = list; | |
| } | |
| /** | |
| * 用于空集合转换类型 | |
| * | |
| * @param rClass 目标类型 | |
| * @param list 源集合 | |
| */ | |
| private PageData(Class<T> rClass, List<?> list) { | |
| if (list instanceof com.github.pagehelper.Page<?> page) { | |
| this.total = page.getTotal(); | |
| this.number = page.getPageNum(); | |
| this.size = page.getPageSize(); | |
| } else { | |
| this.total = 0; | |
| this.number = 1; | |
| this.size = 0; | |
| } | |
| } | |
| /** | |
| * 用于空集合转换类型 | |
| * | |
| * @param list 源集合 | |
| * @param rClass 目标类型 | |
| * @param <T> T | |
| * @param <R> R | |
| * @return PageData | |
| */ | |
| public static <T, R> PageData<R> emptyOf(List<T> list, Class<R> rClass) { | |
| return new PageData<>(rClass, list); | |
| } | |
| @Override | |
| public int getTotalPages() { | |
| return getSize() == 0 ? 1 : (int) Math.ceil((double) total / (double) getSize()); | |
| } | |
| @Override | |
| public long getTotalElements() { | |
| return total; | |
| } | |
| @Override | |
| public int getNumber() { | |
| return number; | |
| } | |
| @Override | |
| public int getSize() { | |
| return size; | |
| } | |
| @Override | |
| public int getNumberOfElements() { | |
| return getSize(); | |
| } | |
| @Override | |
| public @NotNull List<T> getContent() { | |
| return content; | |
| } | |
| @Override | |
| public boolean hasContent() { | |
| List<T> list = getContent(); | |
| return !list.isEmpty(); | |
| } | |
| @Override | |
| @JsonIgnore | |
| public @NotNull Sort getSort() { | |
| return Sort.unsorted(); | |
| } | |
| @Override | |
| public boolean isFirst() { | |
| return getNumber() == 1; | |
| } | |
| @Override | |
| public boolean isLast() { | |
| return getNumber() == getTotalPages(); | |
| } | |
| @Override | |
| public boolean hasNext() { | |
| return getNumber() < getTotalPages(); | |
| } | |
| @Override | |
| public boolean hasPrevious() { | |
| return getNumber() > 1; | |
| } | |
| @Override | |
| public @NotNull Pageable nextPageable() { | |
| return new PageParams(getNumber() + 1, getSize()); | |
| } | |
| @Override | |
| public @NotNull Pageable previousPageable() { | |
| return new PageParams(getNumber() - 1, getSize()); | |
| } | |
| @Override | |
| public <U> @NotNull Page<U> map(@NotNull Function<? super T, ? extends U> converter) { | |
| List<T> content = getContent(); | |
| List<U> result = new ArrayList<>(content.size()); | |
| for (T element : content) { | |
| result.add(converter.apply(element)); | |
| } | |
| PageData<U> newPage = new PageData<>(); | |
| newPage.content = result; | |
| newPage.total = this.total; | |
| newPage.number = this.number; | |
| newPage.size = this.size; | |
| return newPage; | |
| } | |
| @NotNull | |
| @Override | |
| public Iterator<T> iterator() { | |
| return getContent().iterator(); | |
| } | |
| @Override | |
| @JsonIgnore | |
| public @NotNull Pageable getPageable() { | |
| return new PageParams(this.getNumber(), this.getSize()); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import lombok.Data; | |
| import org.jetbrains.annotations.NotNull; | |
| import org.springframework.data.domain.Pageable; | |
| import org.springframework.data.domain.Sort; | |
| import java.util.Optional; | |
| /** | |
| * Spring 的 PageRequest 是从 0 开始的分页。所以只能自定义一个从 1 开始的分页参数 | |
| */ | |
| @Data | |
| public class PageParams implements Pageable { | |
| private int page = 1; | |
| private int size = 10; | |
| private Sort sort = Sort.unsorted(); | |
| public PageParams() { | |
| } | |
| public PageParams(int page, int size) { | |
| this.page = page; | |
| this.size = size; | |
| } | |
| @Override | |
| public boolean isPaged() { | |
| return Pageable.super.isPaged(); | |
| } | |
| @Override | |
| public boolean isUnpaged() { | |
| return Pageable.super.isUnpaged(); | |
| } | |
| @Override | |
| public int getPageNumber() { | |
| return page; | |
| } | |
| @Override | |
| public int getPageSize() { | |
| return size; | |
| } | |
| @Override | |
| public long getOffset() { | |
| return (long) (page - 1) * size; | |
| } | |
| @Override | |
| public @NotNull Sort getSort() { | |
| return sort; | |
| } | |
| @Override | |
| public @NotNull Sort getSortOr(@NotNull Sort sort) { | |
| return Pageable.super.getSortOr(sort); | |
| } | |
| @Override | |
| public @NotNull Pageable next() { | |
| return new PageParams(page + 1, size); | |
| } | |
| @Override | |
| public @NotNull Pageable previousOrFirst() { | |
| return hasPrevious() ? previous() : first(); | |
| } | |
| private Pageable previous() { | |
| return new PageParams(page - 1, size); | |
| } | |
| @Override | |
| public @NotNull Pageable first() { | |
| return new PageParams(1, size); | |
| } | |
| @Override | |
| public @NotNull Pageable withPage(int pageNumber) { | |
| return new PageParams(pageNumber, this.getPageSize()); | |
| } | |
| @Override | |
| public boolean hasPrevious() { | |
| return page > 1; | |
| } | |
| @Override | |
| public @NotNull Optional<Pageable> toOptional() { | |
| return Pageable.super.toOptional(); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment