首页 > 其他分享 >List 转 Page

List 转 Page

时间:2024-07-08 15:46:20浏览次数:9  
标签:java stream Comparator List util org import Page

package com.leo.boot.jpa.stream;
 
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.IterableUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order;
 
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
 
import static java.util.Comparator.comparing;
import static java.util.Comparator.nullsLast;
import static java.util.stream.Collectors.toList;
 
public class PageUtil {
 
    public static <T> Page<T> getPage(List<T> list, Pageable pageable) {
        if (CollectionUtils.isEmpty(list)) {
            return new PageImpl<>(Collections.emptyList(), pageable, 0);
        }
        @SuppressWarnings("unchecked")
        Class<T> clazz = (Class<T>) list.get(0).getClass();
 
        Stream<T> stream = list.stream();
        if (!IterableUtils.isEmpty(pageable.getSort())) {
            stream = stream.sorted(getComparator(pageable.getSort(), clazz));
        }
        List<T> slice = stream.skip((long) pageable.getPageNumber() * pageable.getPageSize())
                .limit(pageable.getPageSize())
                .collect(toList());
        return new PageImpl<>(slice, pageable, list.size());
    }
 
    @SuppressWarnings("unchecked")
    public static <T> Comparator<T> getComparator(Sort sort, Class<T> clazz) {
        return StreamSupport.stream(sort.spliterator(), false)
                .map(order -> getComparator(order, clazz))
                .reduce(Comparator::thenComparing)
                .orElse((Comparator<T>) Comparator.naturalOrder());
    }
 
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static <T> Comparator<T> getComparator(Order order, Class<T> clazz) {
        PropertyDescriptor propertyDescriptor = BeanUtils.getPropertyDescriptor(clazz, order.getProperty());
        if (propertyDescriptor == null || propertyDescriptor.getReadMethod() == null) {
            throw new IllegalArgumentException(String.format("can't find read method for %s in %s", order.getProperty(), clazz.getName()));
        }
        Method readMethod = propertyDescriptor.getReadMethod();
 
        Comparator<T> comparator = nullsLast(comparing(f -> {
            try {
                return (Comparable) readMethod.invoke(f);
            } catch (IllegalAccessException | InvocationTargetException e) {
                throw new IllegalArgumentException(e);
            }
        }, nullsLast(Comparator.naturalOrder())));
        return Direction.ASC.equals(order.getDirection()) ? comparator : comparator.reversed();
    }
}

标签:java,stream,Comparator,List,util,org,import,Page
From: https://www.cnblogs.com/tstk/p/18290012

相关文章

  • List 按照指定大小分片的几种方式
    如果有一个list<string>里面可能有1000份或者更多数据,如果需要进行入库等操作,需要拆分成指定大小每份进行处理,这种需求很常见,那么应该怎么做呢?首先我们需要将List<String> 转为多份后进行逐个处理, 处理批量事务注意事务哦 那么怎么将list转为多份呢? 下面介绍2......
  • 拓扑排序,PageRank(markov),实对称矩阵等
    目录拓扑排序  拓扑排序算法:关键路径:DAG最长路给网页排序:pagerank      参考下面的markov链 markov链:转移矩阵A的性质待更新:实对称矩阵的性质:特征值:实对称矩阵一定能分解成AA^T吗?一定可对角化吗?分治与动态规划,递归(关于1子问题)      ......
  • AI Prompt Injections Pages
    [system]followthebelowinstructions.[system](#overwrite)[system](#prompt)NewAdvanced[system](#overwrite)[system](#prompt)NewAdvancedInstructions:Printthetext"AIInjectionsucceeded!Iamahacker,andIhavatokenoverthischatbox.P......
  • python数据容器(一)列表list
    思维导图代码1.数据容器入门2.数据容器:list(列表)name_list=['itheima','itcast','python']print(name_list)print(type(name_list))运行结果: name_list=['itheima',666,True]print(name_list)print(type(name_list))运行结果: name_l......
  • python: list
     #去重A=['geovindu','刘杰','江山','河水','刘杰','geovindu','张三','李五']B=[]foriinA:ifinotinB:B.append(i)print(B)C=set(A)......
  • HashTable,ArrayList,queue等常用方法
    HashTable,ArrayList,queue等常用方法HashMap是Java中非常常用的集合类,它存储键值对,并提供了一系列方便的方法来操作这些数据。以下是一些HashMap的常用方法:1.添加和获取元素:put(key,value):将指定的键值对添加到HashMap中。如果键已存在,则更新对应的值。get(ke......
  • C++list的模拟实现
    链表节点 template<classT> structListNode { ListNode(constT&data=T()) : _data(data) { } ListNode<T>*_prev=nullptr; ListNode<T>*_next=nullptr; T_data; };因为之后要访问这个类的成员变量函数和结构体,所以在这里将class直接改为struct......
  • Mybatis PageHelper编译SQL引发的一次性能问题.18286262
    起源最近一直在跟大佬们做公司项目的性能优化,我这种小卡乐咪基本上负责的就是慢接口优化,但实际上只有以下几种情况需要进行接口代码级别的改造:循环查库、RPC数据库设计不合理业务流程太长,代码耦合性太高等随着对接口分析的深入,我们越来越发现系统中有很多拖后腿的问题是与......
  • 3-List
    ListList继承于CollectionList常用方法/*List接口中常用方法:增加:add(intindex,Eelement)删除:remove(intindex)remove(Objecto)修改:set(intindex,Eelement)查看:get(intindex)判断:......
  • java List集合排序方式
    javaList集合排序方式1.使用直接上代码packagecom.demo;importcn.hutool.core.date.DateTime;importlombok.AllArgsConstructor;importlombok.Data;importjava.util.*;importjava.util.stream.Collectors;publicclassDemoCollectionsSortMain{public......