Java List 分页

该PageUtils类实现了对列表数据的分页功能,支持按页获取数据和获取总页数。提供了两种静态方法,一种无需指定页码,另一种可指定当前页码。类内部使用了迭代器进行遍历,适用于处理大数据量时避免一次性加载所有数据。
摘要由CSDN通过智能技术生成
import com.alibaba.fastjson2.JSONObject;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @Description 分页工具
 * @Author WangKun
 * @Date 2023/4/27 17:50
 * @Version
 */
public class PageUtils<T> {

    // 分页数据
    private final List<T> data;
    // 每页显示多少数据
    private final int pageSize;

    /**
     * @param data     分页数据
     * @param pageSize 每页条数
     * @Description
     * @Throws
     * @Return
     * @Date 2023-04-27 17:55:14
     * @Author WangKun
     */
    public PageUtils(List<T> data, int pageSize) {
        this.data = data;
        this.pageSize = pageSize;
    }

    /**
     * @param pageNum 第几页
     * @Description 获取某页数据,从第1页开始
     * @Throws
     * @Return java.util.List<T>  分页数据
     * @Date 2023-04-27 17:55:50
     * @Author WangKun
     */
    public List<T> page(int pageNum) {
        if (pageNum < 1) {
            pageNum = 1;
        }
        int from = (pageNum - 1) * pageSize;
        int to = Math.min(pageNum * pageSize, data.size());
        if (from > to) {
            from = to;
        }
        return data.subList(from, to);
    }

    /**
     * @param
     * @Description 获取总页数
     * @Throws
     * @Return int
     * @Date 2023-04-27 17:56:14
     * @Author WangKun
     */
    public int getPageCount() {
        if (pageSize == 0) {
            return 0;
        }
        return data.size() % pageSize == 0 ? (data.size() / pageSize) : (data.size() / pageSize + 1);
    }

    /**
     * @param
     * @Description 元素迭代器
     * @Throws
     * @Return java.util.Iterator<java.util.List < T>>
     * @Date 2023-04-27 17:56:21
     * @Author WangKun
     */
    public Iterator<List<T>> iterator() {
        return new Itr();
    }

    /**
     * @Description
     * @Throws
     * @Return
     * @Date 2023-04-27 17:56:47
     * @Author WangKun
     */
    private class Itr implements Iterator<List<T>> {
        int page = 1;

        Itr() {
        }

        public boolean hasNext() {
            return page <= getPageCount();
        }

        public List<T> next() {
            int i = page;
            if (i > getPageCount())
                return new ArrayList<>();
            page = i + 1;
            return PageUtils.this.page(i);
        }
    }

    /**
     * @param data     数据
     * @param pageSize 每页显示多少数据
     * @Description List分页 (无需指定页码)
     * @Throws
     * @Return java.util.List<com.alibaba.fastjson2.JSONObject>
     * @Date 2023-05-04 17:23:52
     * @Author WangKun
     */
    public static List<JSONObject> getPageList(List<JSONObject> data, int pageSize) {
        List<JSONObject> list = new ArrayList<>();
        if (null == data || data.size() == 0) {
            return list;
        }
        PageUtils<JSONObject> pager = new PageUtils<>(data, pageSize);

        JSONObject obj = new JSONObject();
        JSONObject pageData = new JSONObject();
        Iterator<List<JSONObject>> iterator = pager.iterator();
        // 无需指定页码
        int i = 0;
        while (iterator.hasNext()) {
            List<JSONObject> next = iterator.next();
            pageData.put(String.valueOf(++i), next);
        }
        obj.put("page", pageData);
        obj.put("totalCount", data.size());
        obj.put("totalPage", pager.getPageCount());
        obj.put("pageSize", pageSize);
        list.add(obj);
        return list;
    }

    /**
     * @param data     数据
     * @param pageSize 每页显示多少数据
     * @param currPage 当前页数(页码)
     * @Description List分页(指定页码情况使用 , 页码从第一页开始 , 且小于等于总页数 !)
     * @Throws
     * @Return java.util.List<com.alibaba.fastjson2.JSONObject>
     * @Date 2023-05-04 17:28:31
     * @Author WangKun
     */
    public static List<JSONObject> getPageList(List<JSONObject> data, int pageSize, int currPage) {
        List<JSONObject> list = new ArrayList<>();
        if (null == data || data.size() == 0) {
            return list;
        }

        int size = data.size();
        if (currPage > size) {
            return list;
        }
        PageUtils<JSONObject> pager = new PageUtils<>(data, pageSize);
        JSONObject obj = new JSONObject();
        JSONObject pageData = new JSONObject();
        // 指定页码情况使用,页码从第一页开始,且小于等于总页数!
        for (int i = currPage; i <= pager.getPageCount(); i++) {
            List<JSONObject> page = pager.page(i);
            pageData.put(String.valueOf(i), page);
        }
        obj.put("page", pageData);
        obj.put("totalCount", size);
        obj.put("totalPage", pager.getPageCount());
        obj.put("pageSize", pageSize);
        list.add(obj);
        return list;
    }

调用: 

List<JSONObject> listObj = PageUtils.getPageList( 数据,每页显示多少);

List<JSONObject> listObj = PageUtils.getPageList( 数据,每页显示多少,页码(必须小于等于总数));

参考: Java内存分页工具类 - 码农教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的List可以通过分页实现对数据的分批处理,常见的方法有两种: 1. 使用subList方法实现分页 List提供了subList方法,可以截取List中某一段数据作为一个子List返回,此方法的参数是起始索引和终止索引,起始索引包含在子List中,而终止索引则不包含在子List中。因此,可以通过计算起始索引和终止索引来实现分页。 例如,假设我们有一个List<Integer>,要将其中的数据按照每页10条进行分页,可以按照如下代码实现: ``` List<Integer> list = new ArrayList<>(); // 初始化list int pageNum = 2; // 第2页 int pageSize = 10; // 每页10条数据 int startIndex = (pageNum - 1) * pageSize; int endIndex = pageNum * pageSize; if (endIndex > list.size()) { endIndex = list.size(); } List<Integer> subList = list.subList(startIndex, endIndex); ``` 2. 使用分页插件实现分页 除了手动计算起始索引和终止索引之外,还可以使用一些开源的分页插件来实现分页功能,比如MyBatis提供的分页插件PageHelper。使用分页插件可以简化代码,提高开发效率。 以PageHelper为例,可以按照如下步骤来实现分页: 1. 引入PageHelper的Maven依赖: ``` <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.2.1</version> </dependency> ``` 2. 在MyBatis的配置文件中配置PageHelper插件: ``` <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"/> </plugins> ``` 3. 在Java代码中使用PageHelper.startPage方法来开启分页功能: ``` int pageNum = 2; // 第2页 int pageSize = 10; // 每页10条数据 PageHelper.startPage(pageNum, pageSize); List<Integer> list = mapper.selectList(); // 进行查询操作 ``` 使用PageHelper插件可以自动计算起始索引和终止索引,而且还支持多种数据库的分页方式,非常方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值