Java基于反射的内存分页排序
2026/7/28 19:29:54 网站建设 项目流程

Java基于反射的内存分页排序

    • 序言
    • 应用场景
    • 程序源码

序言

提到分页,我想大部分开发者首先会想到数据库分页技术。是的,正常情况下分页排序我们都会交给数据库来做,毕竟这么做省时省力。凡是都有例外,当我们的业务逻辑或者查询数据无法通过一条sql完成时,这时我们就需要把所有的数据查询出来,在内存中进行排序分页。

应用场景

提到内存,我们就要知道如果数据量过大,本篇分享就不再适用。这里主要是针对成千上万条数据可以这么多,超出10万条以上,最好不要这么做,因为无论是执行效率还是内存CPU占用都是非常大的。

程序源码

因为工作上一个紧急需求,所以对于代码优化这块没有怎么用心去做。主要技术点就是反射技术。
ListSortUtils :排序工具类

/** * List通用排序工具类 * * @author bin.bi */publicclassListSortUtils{/** * 基础对象列表排序,如List<Integer>|List<String> */publicstatic<T>voidsort(List<T>list,final String sort){if(StringUtils.isEmpty(sort)){return;}Collections.sort(list,newComparator<T>(){@Overridepublicintcompare(To1,To2){int ret=0;if(o1==null&&o2!=null){ret=-1;}elseif(o1!=null&&o2==null){ret=1;}elseif(o1==null&&o2==null){return0;}if(o1instanceofBigDecimal){ret=((BigDecimal)o1).compareTo((BigDecimal)o2);}elseif(o1instanceofString){ret=(o1.toString()).compareTo(o2.toString());}elseif(o1instanceofDate){ret=((Date)o1).compareTo((Date)o2);}else{ret=(o1.toString()).compareTo(o2.toString());}returnSortEnum.ASC.getSort().equals(sort)?ret:-ret;}});}/** * 自定义对象排序 * @param field 排序字段 * @param sort 排序类型,升序还是降序 */publicstatic<T>voidsort(List<T>list,final String field,final String sort){if(StringUtils.isEmpty(field)||StringUtils.isEmpty(sort)){return;}Collections.sort(list,newComparator<T>(){@Overridepublicintcompare(To1,To2){Integer ret=0;if(o1==null&&o2!=null){returnSortEnum.ASC.getSort().equals(sort)?1:-1;}elseif(o1!=null&&o2==null){returnSortEnum.ASC.getSort().equals(sort)?-1:1;}elseif(o1==null&&o2==null){return0;}try{Field field1=o1.getClass().getDeclaredField(field);field1.setAccessible(true);Class<?>type=field1.getType();if(type==String.class){ret=getCompareResult(o1,o2,field1,sort);if(ret==null){ret=((String)field1.get(o1)).compareTo((String)field1.get(o2));}}elseif(type==BigDecimal.class){ret=getCompareResult(o1,o2,field1,sort);if(ret==null){ret=((BigDecimal)field1.get(o1)).compareTo((BigDecimal)field1.get(o2));}}elseif(type==double.class||type==Double.class){ret=getCompareResult(o1,o2,field1,sort);if(ret==null){ret=((Double)field1.get(o1)).compareTo((Double)field1.get(o2));}}elseif(type==long.class||type==Long.class){ret=getCompareResult(o1,o2,field1,sort);if(ret==null){ret=((Long)field1.get(o1)).compareTo((Long)field1.get(o2));}}elseif(type==int.class||type==Integer.class){ret=getCompareResult(o1,o2,field1,sort);if(ret==null){ret=((Integer)field1.get(o1)).compareTo((Integer)field1.get(o2));}}elseif(type==Date.class){ret=getCompareResult(o1,o2,field1,sort);if(ret==null){ret=((Date)field1.get(o1)).compareTo((Date)field1.get(o2));}}else{ret=getCompareResult(o1,o2,field1,sort);if(ret==null){ret=(field1.get(o1).toString()).compareTo(field1.get(o2).toString());}}}catch(Exceptione){}returnSortEnum.ASC.getSort().equals(sort)?ret:-ret;}});}privatestatic<T>IntegergetCompareResult(To1,To2,Field field,String sort){try{if(field.get(o1)==null&&field.get(o2)!=null){returnSortEnum.ASC.getSort().equals(sort)?1:-1;}if(field.get(o1)!=null&&field.get(o2)==null){returnSortEnum.ASC.getSort().equals(sort)?-1:1;}if(field.get(o1)==null&&field.get(o1)==null){return0;}returnnull;}catch(Exceptione){return0;}}}

分页工具类

packagecom.aispeech.mscp.dca.common.utils;importjava.util.Arrays;importjava.util.Collections;importjava.util.List;importcom.aispeech.mscp.component.common.util.StringHelper;importcom.aispeech.mscp.dca.common.constants.CommonConstant;importcom.aispeech.mscp.dca.common.constants.SortEnum;importcom.aispeech.mscp.dca.common.form.PageForm;importcom.aispeech.mscp.dca.common.mode.PageSummaryTemplate;importcom.aispeech.mscp.dca.common.function.IPackFunction;importcom.aispeech.mscp.dca.common.function.IPageFunction;importcom.aispeech.mscp.dca.common.function.ISummaryFunction;importcom.baomidou.mybatisplus.plugins.Page;importcom.baomidou.mybatisplus.toolkit.CollectionUtils;publicclassPageUtils{/** * 分页 * @param list * @param pageNum 页码 * @param pageSize 每页多少条数据 * @return */publicstatic<T>List<T>paging(List<T>list,Integer pageNum,Integer pageSize){if(CollectionUtils.isEmpty(list)){returnCollections.emptyList();}Integer count=list.size();// 记录总数Integer pageCount=0;// 页数if(count%pageSize==0){pageCount=count/pageSize;}else{pageCount=count/pageSize+1;}int fromIndex=0;// 开始索引int toIndex=0;// 结束索引if(pageNum!=pageCount){fromIndex=(pageNum-1)*pageSize;toIndex=fromIndex+pageSize;}else{fromIndex=(pageNum-1)*pageSize;toIndex=count;}List<T>pageList=list.subList(fromIndex,toIndex);returnpageList;}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询