Skip to content

Instantly share code, notes, and snippets.

@JonasGao
Created July 27, 2023 06:34
Show Gist options
  • Select an option

  • Save JonasGao/cdbe11869fd1b37308a607d9524d0de8 to your computer and use it in GitHub Desktop.

Select an option

Save JonasGao/cdbe11869fd1b37308a607d9524d0de8 to your computer and use it in GitHub Desktop.
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());
}
}
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