
Java基于反射的内存分页排序序言应用场景程序源码序言提到分页我想大部分开发者首先会想到数据库分页技术。是的正常情况下分页排序我们都会交给数据库来做毕竟这么做省时省力。凡是都有例外当我们的业务逻辑或者查询数据无法通过一条sql完成时这时我们就需要把所有的数据查询出来在内存中进行排序分页。应用场景提到内存我们就要知道如果数据量过大本篇分享就不再适用。这里主要是针对成千上万条数据可以这么多超出10万条以上最好不要这么做因为无论是执行效率还是内存CPU占用都是非常大的。程序源码因为工作上一个紧急需求所以对于代码优化这块没有怎么用心去做。主要技术点就是反射技术。ListSortUtils 排序工具类/** * List通用排序工具类 * * author bin.bi */publicclassListSortUtils{/** * 基础对象列表排序如ListInteger|ListString */publicstaticTvoidsort(ListTlist,final String sort){if(StringUtils.isEmpty(sort)){return;}Collections.sort(list,newComparatorT(){Overridepublicintcompare(To1,To2){int ret0;if(o1nullo2!null){ret-1;}elseif(o1!nullo2null){ret1;}elseif(o1nullo2null){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 排序类型升序还是降序 */publicstaticTvoidsort(ListTlist,final String field,final String sort){if(StringUtils.isEmpty(field)||StringUtils.isEmpty(sort)){return;}Collections.sort(list,newComparatorT(){Overridepublicintcompare(To1,To2){Integer ret0;if(o1nullo2!null){returnSortEnum.ASC.getSort().equals(sort)?1:-1;}elseif(o1!nullo2null){returnSortEnum.ASC.getSort().equals(sort)?-1:1;}elseif(o1nullo2null){return0;}try{Field field1o1.getClass().getDeclaredField(field);field1.setAccessible(true);Class?typefield1.getType();if(typeString.class){retgetCompareResult(o1,o2,field1,sort);if(retnull){ret((String)field1.get(o1)).compareTo((String)field1.get(o2));}}elseif(typeBigDecimal.class){retgetCompareResult(o1,o2,field1,sort);if(retnull){ret((BigDecimal)field1.get(o1)).compareTo((BigDecimal)field1.get(o2));}}elseif(typedouble.class||typeDouble.class){retgetCompareResult(o1,o2,field1,sort);if(retnull){ret((Double)field1.get(o1)).compareTo((Double)field1.get(o2));}}elseif(typelong.class||typeLong.class){retgetCompareResult(o1,o2,field1,sort);if(retnull){ret((Long)field1.get(o1)).compareTo((Long)field1.get(o2));}}elseif(typeint.class||typeInteger.class){retgetCompareResult(o1,o2,field1,sort);if(retnull){ret((Integer)field1.get(o1)).compareTo((Integer)field1.get(o2));}}elseif(typeDate.class){retgetCompareResult(o1,o2,field1,sort);if(retnull){ret((Date)field1.get(o1)).compareTo((Date)field1.get(o2));}}else{retgetCompareResult(o1,o2,field1,sort);if(retnull){ret(field1.get(o1).toString()).compareTo(field1.get(o2).toString());}}}catch(Exceptione){}returnSortEnum.ASC.getSort().equals(sort)?ret:-ret;}});}privatestaticTIntegergetCompareResult(To1,To2,Field field,String sort){try{if(field.get(o1)nullfield.get(o2)!null){returnSortEnum.ASC.getSort().equals(sort)?1:-1;}if(field.get(o1)!nullfield.get(o2)null){returnSortEnum.ASC.getSort().equals(sort)?-1:1;}if(field.get(o1)nullfield.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 */publicstaticTListTpaging(ListTlist,Integer pageNum,Integer pageSize){if(CollectionUtils.isEmpty(list)){returnCollections.emptyList();}Integer countlist.size();// 记录总数Integer pageCount0;// 页数if(count%pageSize0){pageCountcount/pageSize;}else{pageCountcount/pageSize1;}int fromIndex0;// 开始索引int toIndex0;// 结束索引if(pageNum!pageCount){fromIndex(pageNum-1)*pageSize;toIndexfromIndexpageSize;}else{fromIndex(pageNum-1)*pageSize;toIndexcount;}ListTpageListlist.subList(fromIndex,toIndex);returnpageList;}}