Java实现List集合手动分页的方法

 更新时间:2024年03月06日 10:47:57   作者:师小师  
在工作中难免会遇到,将组装的集合数据进行分页处理,本文主要介绍了Java实现List集合手动分页的方法,具有一定的参考价值,感兴趣的可以了解一下

为方便测试,可以直接在 controller 内添加一个方法,或者直接通过 main 方法测试

List 手动分页

@GetMapping("/getUserInfo")
    public Map<String,Object> getUserInfo(@RequestParam("pageNo") Integer pageNo,@RequestParam("pageSize") Integer pageSize){
        if(null == pageNo){
            pageNo = 1;
        }
        if(null == pageSize){
            pageSize = 10;
        }
        List<User> userList = new ArrayList<>();
        userList.add(new User(1,"奥迪1",23,"123@qq.com","地址1"));
        userList.add(new User(2,"奥迪2",23,"124@qq.com","地址2"));
        userList.add(new User(3,"奥迪3",23,"124@qq.com","地址3"));
        userList.add(new User(4,"奥迪4",23,"125@qq.com","地址4"));
        userList.add(new User(5,"奥迪4",23,"126@qq.com","地址5"));
        userList.add(new User(6,"奥迪5",23,"127@qq.com","地址6"));
        userList.add(new User(7,"奥迪6",23,"128@qq.com","地址7"));
        userList.add(new User(8,"奥迪7",23,"129@qq.com","地址8"));
        userList.add(new User(9,"奥迪7",23,"1219@qq.com","地址9"));
        userList.add(new User(10,"奥迪10",23,"1231@qq.com","地址10"));
        userList.add(new User(11,"奥迪11",23,"1232@qq.com","地址11"));

        Integer limit = (pageNo-1)*pageSize;
        Integer totalSize = userList.size();
        // 方法一
        Integer totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
        // 方法二(推荐)其中 pageSize-1 就是 totalSize/pageSize 的最大的余数
        // Integer totalPage = (totalSize + pageSize -1) / pageSize;
        // 方法三
        // Integer totalPage = (int) Math.ceil(totalSize / pageSize);

        if(pageNo > totalPage){
            throw new RuntimeException("页数超出了");
        }
        List<User> subList = null;
        if(pageNo == totalPage){
            // 最后一页
            subList = userList.subList(limit, totalSize);
        }else{
            Integer end= limit + pageSize;
            // 截取的最后的下标
            subList = userList.subList(limit, end);
            // 出现空值处理
            // subList = CollectionUtils.isEmpty(userList) ? new ArrayList<>() : userList.subList(limit, Math.min(userList.size(), end));
        }
        Map<String,Object> map = new HashMap<>();
        map.put("data",subList);
        map.put("total",userList.size());
        subList.forEach(System.out::println);
        return map;
    }
    static class User{
        private Integer id;
        private String name;
        private Integer age;
        private String email;
        private String address;

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        public String getEmail() {
            return email;
        }

        public void setEmail(String email) {
            this.email = email;
        }

        public String getAddress() {
            return address;
        }

        public void setAddress(String address) {
            this.address = address;
        }

        public User(Integer id, String name, Integer age, String email, String address) {
            this.id = id;
            this.name = name;
            this.age = age;
            this.email = email;
            this.address = address;
        }

        @Override
        public String toString() {
            return "User{" +
                    "id='" + id + '\'' +
                    ", name='" + name + '\'' +
                    ", age=" + age +
                    ", email='" + email + '\'' +
                    ", address='" + address + '\'' +
                    '}';
        }
    }

计算总页数方法

// totalPage 总页数,pageSize 每页显示多少条,totalSize 总条数
// 方法一
Integer totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
// 方法二(推荐)其中 pageSize-1 就是 totalSize/pageSize 的最大的余数
// Integer totalPage = (totalSize + pageSize -1) / pageSize;
// 方法三
// Integer totalPage = (int) Math.ceil(totalSize / pageSize);

补:

利用 Lists.partition() 方法进行数据将数据切割分页

List<UserEntity> resultList = new ArrayList<>();     // 将数据按照传过来页长进行切割
        List<List<UserEntity>> partition = Lists.partition(userList,pageSize);
        for (int i = 0; i < partition.size(); i++) {
            if (i == pageIndex){
                resultList  = partition.get(pageIndex);
            }
      }

利用封装的分页工具进行分页

(1)分页工具

/**
 * @project 
 * @Description 对List集合进行份分页
 * @Author songwp
 * @Date 2023/5/12 13:55
 **/
public class ListPagingUtil {
        private Integer currentPage;//当前页
        private Integer pageSize;//每页显示记录条数
        private Integer totalPage;//总页数
        private Integer star;//开始数据
        private Integer total;//总条数
        private List<?> dataList;//每页显示的数据

        public Integer getCurrentPage() {
            return currentPage;
        }

        public void setCurrentPage(Integer currentPage) {
            this.currentPage = currentPage;
        }

        public Integer getPageSize() {
            return pageSize;
        }

        public void setPageSize(Integer pageSize) {
            this.pageSize = pageSize;
        }

        public Integer getTotalPage() {
            return totalPage;
        }

        public void setTotalPage(Integer totalPage) {
            this.totalPage = totalPage;
        }

        public List<?> getDataList() {
            return dataList;
        }

        public void setDataList(List<?> dataList) {
            this.dataList = dataList;
        }

        public Integer getStar() {
            return star;
        }

        public void setStar(Integer star) {
            this.star = star;
        }

        public Integer getTotal() {
            return total;
        }

        public void setTotal(Integer total) {
            this.total = total;
        }

        @Override
        public String toString() {
            return "ListPagingUtil{" +
                    "currentPage=" + currentPage +
                    ", pageSize=" + pageSize +
                    ", totalPage=" + totalPage +
                    ", dataList=" + dataList +
                    ", star=" + star +
                    ", total=" + total +
                    '}';
        }

        public void pageStartInfo(Integer currentPage, Integer pageSize){
            //如果传入的pageNumber为null给pageNumber赋为1
            currentPage = currentPage == null ? 1 : currentPage;
            //如果传入的pageSize为null给pageSize赋为10
            pageSize = pageSize == null ? 10 : pageSize;
            this.setCurrentPage(currentPage);
            this.setPageSize(pageSize);
        }

        public static ListPagingUtil paging(Integer currentPage, Integer pageSize, List<?> list) {
            ListPagingUtil pagingUtil = new ListPagingUtil();
            //初始化
            pagingUtil.pageStartInfo(currentPage, pageSize);
            //设置起始数据
            pagingUtil.setStar((pagingUtil.getCurrentPage()-1)*pagingUtil.getPageSize());
            //设置总数
            pagingUtil.setTotal(list.size());
            //设置总页数
            pagingUtil.setTotalPage(pagingUtil.getTotal() % pagingUtil.getPageSize() == 0 ? pagingUtil.getTotal()/pagingUtil.getPageSize() :pagingUtil.getTotal()/pagingUtil.getPageSize()+1);
            //截取list
            pagingUtil.setDataList(list.subList(pagingUtil.getStar(), pagingUtil.getTotal()-pagingUtil.getStar()>pagingUtil.getPageSize()?pagingUtil.getStar()+pagingUtil.getPageSize():pagingUtil.getTotal()));
            return pagingUtil;
        }
}

(2)方法调用

ListPagingUtil.paging(pageIndex,pageSize, userList)

利用 stream进行分页 处理

方法一:

List<List<CompanyStaffEquipStatisticVO>> partition = ListUtils.partition(result, param.getPageSize());
        List<CompanyStaffEquipStatisticVO> companyStaffEquipStatisticVOS = param.getPageIndex() > partition.size() ? new ArrayList<>() : partition.get(param.getPageIndex() - 1);
        SafePageParam safePageParam = new SafePageParam();
        safePageParam.setPage(true);
        safePageParam.setPageSize(param.getPageSize());
        PageVO<CompanyStaffEquipStatisticVO> voResult = new PageVO<>(safePageParam, companyStaffEquipStatisticVOS, result.size());
        if (param.getPageIndex()*param.getPageSize()<result.size()) {
            voResult.setHasNext(true);
        }
        return voResult;

方法二:

List<VendorExcelVO> resultVO = getVendorProjectListInfo(param);
PageVO<VendorExcelVO> voPageVO = new PageVO<>();
List<VendorExcelVO> collectList = resultVO.stream().skip((param.getPageIndex() - 1) * param.getPageSize()).limit(param.getPageSize()).collect(Collectors.toList());
voPageVO.setPage(true);
voPageVO.setPageSize(param.getPageSize());
voPageVO.setCount(resultVO.size());
voPageVO.setList(collectList);
if (param.getPageIndex() * param.getPageSize() < resultVO.size()){
    voPageVO.setHasNext(true);
}
return voPageVO;

 到此这篇关于Java实现List集合手动分页的方法的文章就介绍到这了,更多相关Java List集合手动分页内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在java中如何将inputStream对象转换为File对象(不生成本地文件)

    在java中如何将inputStream对象转换为File对象(不生成本地文件)

    这篇文章主要介绍了在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Java实现差分数组的示例详解

    Java实现差分数组的示例详解

    差分数组是由原数组进化而来,值为原数组当前位置值减去上一个位置的值。本文将通过例题详解如何利用Java实现差分数组,需要的可以参考一下
    2022-06-06
  • java实现字符串反转案例

    java实现字符串反转案例

    这篇文章主要为大家详细介绍了java实现字符串反转,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • java基础详细笔记之异常处理

    java基础详细笔记之异常处理

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的,下面这篇文章主要给大家介绍了关于java基础详细笔记之异常处理的相关资料,需要的朋友可以参考下
    2022-03-03
  • Java servlet、filter、listener、interceptor之间的区别和联系

    Java servlet、filter、listener、interceptor之间的区别和联系

    这篇文章主要介绍了Java servlet、filter、listener、interceptor之间的区别和联系的相关资料,需要的朋友可以参考下
    2016-11-11
  • 使用SpringBoot动态切换数据源的实现方式

    使用SpringBoot动态切换数据源的实现方式

    在我们企业项目开发的过程中,有的时候,一个项目需要在运行时,根据某种条件选择使用哪个数据源,那么此时该怎么进行动态切换呢,本文给大家例举一种常见的实现方式,文中有详细的实现步骤,需要的朋友可以参考下
    2023-12-12
  • 在 IntelliJ IDEA 中安装和配置 Java 17的实战记录

    在 IntelliJ IDEA 中安装和配置 Java 17的实战记录

    文章介绍了如何在IntelliJ IDEA中安装和配置Java 17,包括下载JDK、配置项目SDK、设置语言级别以及验证配置,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • jstack+jdb命令查看线程及死锁堆栈信息的实例

    jstack+jdb命令查看线程及死锁堆栈信息的实例

    这篇文章主要介绍了jstack+jdb命令查看线程及死锁堆栈信息的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java的常用包

    Java的常用包

    本文主要对Java的常用包进行一一介绍。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • Java判断数字位数的方法总结

    Java判断数字位数的方法总结

    本文给大家整理了Java判断数字位数的两种常用方法,对此有兴趣的可以跟着小编一起学习下。
    2018-02-02

最新评论