Java 企业级工具类全家桶-50-集合排序工具类
拿来即用 Java 企业级工具类全家桶-50-集合排序工具类 目录一、工具类功能二、所需环境三、方法概览按需调用四、调用示例直观体验五、工具类源码可直接复制一、工具类功能给业务代码用的集合排序入口列表按单个字段升/降序、按几个字段依次比较、中文按拼音排另给两个可直接复用的空值安全比较器不必再手写 Comparator 样板。排序原地生效、没有返回值类本身零第三方依赖拼音序用 JDK 自带的 Collator。典型场景是员工先按部门再按薪资、订单按金额倒序、城市与姓名的字典序列表。二、所需环境JDK 17或以上三、方法概览按需调用序号方法入参返回用途1sortAsc(List, FunctionT, C)待排序列表 key提取函数void按单个字段升序空值排最前2sortDesc(List, FunctionT, C)待排序列表 key提取函数void按单个字段降序空值排最后3sortMultiAsc(List, FunctionT, ?…)待排序列表 依次比较的key提取函数void多字段依次升序空值按该字段最小参与比较4sortMultiDesc(List, FunctionT, ?…)待排序列表 依次比较的key提取函数void多字段依次降序空值落在最后5sortChinesePinyinAsc(List, boolean)待排序列表 null是否排最前void中文按拼音升序null 位置由参数定6sortChinesePinyinDesc(List, boolean)待排序列表 null是否排最前void中文按拼音降序null 位置由参数定7nullsFirstNatural(FunctionT, C)key提取函数Comparator造空值排最前的比较器交给 list.sort 或 stream 复用8nullsLastNatural(FunctionT, C)key提取函数Comparator造空值排最后、字段仍按升序的比较器四、调用示例直观体验调用示例直接复制进 IDE 右键 Run 就能看到调用工具类各方法的输出结果。21:00:30.789[main]INFO--「SortUtils方法1sortAsc(ListT,FunctionT,C)」原地升序后薪资-[-,null,5000,7000,9000]21:00:30.792[main]INFO--「SortUtils方法2sortDesc(ListT,FunctionT,C)」原地降序后薪资-[9000,7000,5000,null,-]21:00:30.794[main]INFO--「SortUtils方法3sortMultiAsc(ListT,FunctionT,?...)」部门与薪资-[-,hr/null,sale/5000,tech/7000,tech/9000]21:00:30.794[main]INFO--「SortUtils方法4sortMultiDesc(ListT,FunctionT,?...)」部门与薪资-[tech/9000,tech/7000,sale/5000,hr/null,-]21:00:30.830[main]INFO--「SortUtils方法5sortChinesePinyinAsc(ListString,boolean)」拼音升序null在前-[null,安康,北京,上海,台湾,香港]21:00:30.831[main]INFO--「SortUtils方法6sortChinesePinyinDesc(ListString,boolean)」拼音降序null在后-[香港,台湾,上海,北京,安康,null]21:00:30.832[main]INFO--「SortUtils方法7nullsFirstNatural(FunctionT,C)」交给 list.sort 后薪资-[-,null,5000,7000,9000]21:00:30.840[main]INFO--「SortUtils方法8nullsLastNatural(FunctionT,C)」交给 stream.sorted 后薪资-[5000,7000,9000,null,-]21:00:30.841[main]ERROR--「异常信息获取演示」不可变列表-UnsupportedOperationException21:00:30.841[main]ERROR--「异常信息获取演示」列表为null-待排序列表不能为null21:00:30.842[main]ERROR--「异常信息获取演示」提取函数为空-至少需要一个key提取函数21:00:30.843[main]ERROR--「异常信息获取演示」同一字段返回类型不一致-classjava.lang.Integercannot be casttoclassjava.lang.String(java.lang.Integerandjava.lang.Stringare inmodulejava.baseof loader bootstrap)进程已结束退出代码为0packagecom.example.order.api;importcom.example.common.utils.SortUtils;importlombok.extern.slf4j.Slf4j;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;/** * 调用示例整个文件复制进 IDE右键 Run 就能看效果。 * * p排序工具只吃内存里的列表不依赖外部服务也不需要 Spring 容器示例造一份「薪资有 null、 * 列表里混一个 null 元素」的数据把 8 个入口各调一遍空值的落位与多字段依次比较都能直接看出差别。 * 日志用 Lombok 的 {code Slf4j} SLF4J 占位符没装 Lombok 就把 {code log} 换成项目自己的 Logger。 */Slf4jpublicclassSortUtilsDemo{/** 示例用的员工对象实际换成你自己的id4 那行薪资为 null */publicrecordEmp(intid,Stringdept,Integersalary){}publicstaticvoidmain(String[]args){// 一、单个字段直接排 ListEmpascListemps();SortUtils.sortAsc(ascList,Emp::salary);log.info(「SortUtils 方法1 sortAsc(ListT, FunctionT, C)」原地升序后薪资 - {},salaries(ascList));ListEmpdescListemps();SortUtils.sortDesc(descList,Emp::salary);log.info(「SortUtils 方法2 sortDesc(ListT, FunctionT, C)」原地降序后薪资 - {},salaries(descList));// 二、多个字段依次比较 ListEmpmultiAscListemps();SortUtils.sortMultiAsc(multiAscList,Emp::dept,Emp::salary);log.info(「SortUtils 方法3 sortMultiAsc(ListT, FunctionT, ?...)」部门与薪资 - {},deptSalary(multiAscList));ListEmpmultiDescListemps();SortUtils.sortMultiDesc(multiDescList,Emp::dept,Emp::salary);log.info(「SortUtils 方法4 sortMultiDesc(ListT, FunctionT, ?...)」部门与薪资 - {},deptSalary(multiDescList));// 三、中文拼音排序 ListStringcityAsccities();SortUtils.sortChinesePinyinAsc(cityAsc,true);log.info(「SortUtils 方法5 sortChinesePinyinAsc(ListString, boolean)」拼音升序null 在前- {},cityAsc);ListStringcityDesccities();SortUtils.sortChinesePinyinDesc(cityDesc,false);log.info(「SortUtils 方法6 sortChinesePinyinDesc(ListString, boolean)」拼音降序null 在后- {},cityDesc);// 四、比较器工厂复用 ListEmpsortedByComparatoremps();sortedByComparator.sort(SortUtils.nullsFirstNatural(Emp::salary));log.info(「SortUtils 方法7 nullsFirstNatural(FunctionT, C)」交给 list.sort 后薪资 - {},salaries(sortedByComparator));ListStringstreamSalariesemps().stream().sorted(SortUtils.nullsLastNatural(Emp::salary)).map(emp-empnull?-:String.valueOf(emp.salary())).toList();log.info(「SortUtils 方法8 nullsLastNatural(FunctionT, C)」交给 stream.sorted 后薪资 - {},streamSalaries);// 五、catch异常信息 // 1. 原地排序要求列表可变List.of 的结果会直接拒绝它抛的异常不带文案打异常类型try{SortUtils.sortAsc(List.of(newEmp(1,tech,9000)),Emp::salary);}catch(UnsupportedOperationExceptione){log.error(「异常信息获取演示」不可变列表 - {},e.getClass().getSimpleName());}// 2. 列表为 nulltry{SortUtils.sortAsc(null,Emp::salary);}catch(IllegalArgumentExceptione){log.error(「异常信息获取演示」列表为null - {},e.getMessage());}// 3. 一个提取函数都没传try{SortUtils.sortMultiAsc(emps());}catch(IllegalArgumentExceptione){log.error(「异常信息获取演示」提取函数为空 - {},e.getMessage());}// 4. 同一字段一会儿给字符串一会儿给数字比较时由 compareTo 抛类型异常try{ListEmpmixedemps();SortUtils.sortMultiAsc(mixed,emp-emp.id()%20?emp.dept():emp.salary());}catch(ClassCastExceptione){log.error(「异常信息获取演示」同一字段返回类型不一致 - {},e.getMessage());}}/** 样例数据薪资有 null列表里还混了一个 null 元素排序时它跟着空值规则落位 */privatestaticListEmpemps(){returnnewArrayList(Arrays.asList(newEmp(1,tech,9000),newEmp(2,sale,5000),null,newEmp(3,tech,7000),newEmp(4,hr,null)));}privatestaticListStringcities(){returnnewArrayList(Arrays.asList(北京,上海,null,安康,台湾,香港));}/** 只看薪资null 元素与 null 薪资都写成 - */privatestaticListStringsalaries(ListEmplist){ListStringoutnewArrayList(list.size());for(Empemp:list){out.add(empnull?-:String.valueOf(emp.salary()));}returnout;}/** 「部门/薪资」拼成一行多字段排序的结果一眼能对上 */privatestaticListStringdeptSalary(ListEmplist){ListStringoutnewArrayList(list.size());for(Empemp:list){out.add(empnull?-:emp.dept()/emp.salary());}returnout;}}五、工具类源码可直接复制拿来即用 50-集合排序工具类java企业级代码.zip 工具类已调试通过复制粘贴即可使用省时省力 可保存到自己网盘永久有效觉得对您有帮助麻烦点点关注啦您的关注是我创作的最大动力~