【需求介绍】
小编又跟大家见面了,最近调试app后台接口的时候,遇到了这样一个需求,如下图所示:原始用的真分页查询的列表数据,需要加入上面未领取、已领取的查询条件,该条件是判断当前登陆人是否领取了列表中的任务。
分析:
1、首先查询所有记录以及该条记录的状态(分页查询)
2、通过循环上面查询出来的每条记录进一步查询所有领取的人员,并跟当前登录人进行对比,从而判断该条记录对于当前登录人的本人任务状态
3、加入未领取、已领取这个条件进行筛选的时候就无法准确按照分页查询的每页条数显示
解决办法:
1、将分析过程中的1和2和3步骤合并到一起,也就是通过sql语句来进行级联查询实现(这样在对该条记录级联领取人的时候特别麻烦)
2、将分析过程中1的分页查询去掉,在3步骤之后添加一个假分页
两种解决办法,虽然1解决起来效率比较快一点,但是对于后期的维护以及业务的梳理方面将产生极大的困扰,衡量对比之后,还是选择用方法2的假分页查询进行实现于是就有了下面的具体研究。
由于考虑到其它方面还有可能用到分页查询,于是就封装了一个工具类。
【功能实现】
一、宏观介绍
假分页查询的实现,只需要程序中引入JDK就可以了,因为需要用到其中的rt.jar包
二、分页查询工具类代码
- package com.gxt.common.util; import java.util.Collections; import java.util.List; /** * @author makang-2016年12月1日10:44:49 * 假分页工具类 */ public class Pager<T> { /** * 每页显示条数 */ private int pageSize; public int getPageSize() { return pageSize; } public List<T> getData() { return data; } /** * 原集合存放传入的数据 */ private List<T> data; private Pager(List<T> data, int pageSize) { if (data == null || data.isEmpty()) { //IllegalArgumentException抛出一个不合法或者不正确的参数异常 throw new IllegalArgumentException("传入的数据不能为空!"); } this.data = data; this.pageSize = pageSize; } /** * 创建分页器 * * @param data 需要分页的数据 * @param pageSize 每页显示条数 * @param <T> 业务对象 * @return 分页器 */ public static <T> Pager<T> create(List<T> data, int pageSize) { return new Pager<>(data, pageSize); } /** * 得到分页后的数据 * * @param pageNum 页码 * @return 分页后结果 */ public List<T> getPagedList(int pageNum) { int fromIndex = (pageNum - 1) * pageSize; if (fromIndex >= data.size()) { return Collections.emptyList(); } int toIndex = pageNum * pageSize; if (toIndex >= data.size()) { toIndex = data.size(); } return data.subList(fromIndex, toIndex); } } -
三、具体应用
- //假分页查询,引入了一个临时存放的类 int page = Integer.parseInt(pageIndex); //页数 int count = Integer.parseInt(pageCount);//每页数量 if (page == 0) { page = 1; }else{ page += 1; } //newResult为传入的集合,count为每页的个数,page为页数;Pager为封装的分页查询类 Pager<Integer> pager = Pager.create(newResult, count); List<Integer> page1 = pager.getPagedList(page); -
注:这里我们需要考虑一个边界值问题,也就是第一页我们传入的页数是0还是1的问题,由于我做的是app的后台接口,ios获取之后传递过来的默认第一页为0所以我在具体应用中加入了一个page是0的判定;如果都为以后传递过来的第一页默认都为0的话,也可以将具体应用中的判断放到假分页工具类的getPagedList方法中。
【知识扩展】
其实到上面功能实现模块已经可以结束了,但是小编并不想将自己探索的脚步停止,因为分页查询类中getPagedList(得到分页后的数据)方法中的两个返回值所调用的方法引起了小编的思考,那么读者朋友就跟随小编的脚步去探索一番吧。
首先按着键盘上面的Ctrl单击getPagedList方法中return后面的那两个方法,结果,如下图所示:
不让看?没关系,因为小编前些天总结的【java】——java项目之逆向工程完结 中有提到过,可以百度下载一个jd-gui反编译软件,将对应的jar包反编译过来,去看里面的结构。
按照上图对应的路径,找到对应的jar包文件,如下图所示:
将jar文件拖到jd-gui中,如下图所示:
太尴尬了,出现异常了,不过没关系,下载一个1.6版本的jdk打开就没事啦,如下图:
看到List是一个接口类,通过搜索知道了List的以下实现:
继续找ArrayList和LinkedList中对subList方法的实现:
通过搜索,并没有发现具体的subList实现,不过看到了常用的ArrayList常用的一些实现方法,如果读者朋友有知道的麻烦给我留言,让我们一起成长O(∩_∩)O~
在这里小编的知识探索之路就告一段落啦,希望每一位读者都能够有一个探索的好奇心O(∩_∩)O~
【总结提升】
不经一番彻骨寒,怎得梅花扑鼻香。
通过对假分页的实现,以及知识的探索,让我们在编程之路上走得更加洒脱啦。
总听别人说,所谓的大牛,都是不断的探索,不断的历练,知道的多了,见到的多了,历练的多了,天上的牛也就会多了起来,然后渐渐的,被别人看到之后就会下意识的被别人说,你们看大牛来了,哈哈O(∩_∩)O~
时光总归是短暂的,在这里小编又要跟大家说再见了,这段时间还在研究POI对word的解析,如果读者朋友感兴趣,那就期待我后面的总结分享哦O(∩_∩)O~
走在青春编程的路上,我经历、我成长、我快乐O(∩_∩)O~