新闻详情

新闻详情

首页 / 资讯中心 / 详情

如果像 AI 一样使用 Comparator

发布时间:2026/10/2 8:25:07来源:尧图网络
如果像 AI 一样使用 Comparator
如果像 AI 一样使用 Comparator一句话总结:排序别手写compare方法,AI 用Comparator.comparing(类::getXxx)起步,thenComparing加次级排序,reversed倒序,nullsLast安放 null——全部方法引用,一行链到底。相关文档:《如果像AI一样写Lambda-第1篇-函数式接口-通俗版.md》——Comparator是两个入参、返回 int的盒子,comparing的入参是Function。0. 比喻:排队裁判写法比喻普通人的写法自己当裁判,每两个人比一次,手写谁前谁后函数式写法告诉裁判规则:“按身高排,一样高按年龄排”AI lambda 简写规则只指个方向:“按Person::getHeight”1. comparing:单字段排序场景:人员列表按年龄排序。① 普通人的写法:匿名内部类手写 comparelist.sort(newComparatorPerson(){Overridepublicintcompare(Persono1,Persono2){returnInteger.compare(o1.getAge(),o2.getAge());}});② 函数式写法:comparing lambdalist.sort(Comparator.comparing(p-p.getAge()));③ AI lambda 简写:comparing 方法引用list.sort(Comparator.comparing(Person::getAge));Comparator.comparing接收一个提取排序键的Function:先取出 key,再按 key 的自然顺序比。方法引用Person::getAge就是提取 key 的标准姿势。2. thenComparing:多字段排序场景:先按部门排,同部门按工资排。① 普通人的写法:先比主键,相等再比次键list.sort(newComparatorPerson(){Overridepublicintcompare(Persono1,Persono2){intco1.getDept().compareTo(o2.getDept());if(c!0){returnc;}returnDouble.compare(o1.getSalary(),o2.getSalary());}});② 函数式写法:comparing thenComparinglist.sort(Comparator.comparing(p-p.getDept()).thenComparing(p-p.getSalary()));③ AI lambda 简写:全链路方法引用list.sort(Comparator.comparing(Person::getDept).thenComparing(Person::getSalary));thenComparing可以无限续:主键、次键、三键……一级一级往下接。3. reversed:倒序① 普通人的写法:compare 结果取负list.sort(newComparatorPerson(){Overridepublicintcompare(Persono1,Persono2){return-Integer.compare(o1.getAge(),o2.getAge());}});② 函数式写法:reversed()list.sort(Comparator.comparing(p-p.getAge()).reversed());③ AI lambda 简写list.sort(Comparator.comparing(Person::getAge).reversed());注意:reversed会反转整条链:comparing(A).thenComparing(B).reversed()是 A、B 一起倒序;只想 B 倒序要写comparing(A).thenComparing(Comparator.comparing(B).reversed())。4. nullsFirst / nullsLast:安放 null场景:排序字段可能为 null,别让 NPE 炸了排序。① 普通人的写法:手写 null 判断list.sort(newComparatorPerson(){Overridepublicintcompare(Persono1,Persono2){if(o1.getName()null)returno2.getName()null?0:1;if(o2.getName()null)return-1;returno1.getName().compareTo(o2.getName());}});② 函数式写法:nullsLast 包裹list.sort(Comparator.comparing(p-p.getName(),Comparator.nullsLast(Comparator.naturalOrder())));③ AI lambda 简写:方法引用 nullsLastlist.sort(Comparator.comparing(Person::getName,Comparator.nullsLast(Comparator.naturalOrder())));nullsLast把 null 排到最后,nullsFirst把 null 排到最前。第二个参数声明非 null 之间怎么比。5. 自然序与便捷反向// 自然顺序(元素自己实现 Comparable 时可用)list.sort(Comparator.naturalOrder());// 自然顺序的反向,不用先 naturalOrder 再 reversedlist.sort(Comparator.reverseOrder());6. list.sort 与 sorted 的区别// list.sort:原地排序,直接改原列表list.sort(Comparator.comparing(Person::getAge));// sorted:流式排序,产生新列表,原列表不动ListPersonsortedlist.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList());AI 的选择:要保留原列表 → 流式sorted;原列表不要了 →list.sort。7. 组合速查表需求写法单字段升序Comparator.comparing(类::getXxx)单字段降序Comparator.comparing(类::getXxx).reversed()多字段comparing(A::getX).thenComparing(A::getY)字段可能为 nullcomparing(类::getXxx, Comparator.nullsLast(naturalOrder()))自然序 / 反向naturalOrder()/reverseOrder()数字字段Comparator.comparingInt(类::getAge)(避免装箱,更快)8. 陷阱:三个常见的坑坑 1:reversed 反转整条链// 想要:部门升序、工资降序// ❌ 这样写两个字段都降序了Comparator.comparing(Person::getDept).thenComparing(Person::getSalary).reversed();// ✅ 只反工资这一段Comparator.comparing(Person::getDept).thenComparing(Comparator.comparing(Person::getSalary).reversed());坑 2:字段为 null 且没配 nullsLast → 排序直接 NPE// ❌ 名字有 null 就炸list.sort(Comparator.comparing(Person::getName));// ✅ 用 nullsLast 兜住list.sort(Comparator.comparing(Person::getName,Comparator.nullsLast(String::compareTo)));坑 3:comparing 里写复杂 lambda,类型推断失败// ❌ 编译器推断不出 T,常见于链上再加 nullsLast/reversedlist.sort(Comparator.comparing(p-p.getName()).reversed());// 可能报错// ✅ 明确泛型或换方法引用list.sort(Comparator.comparing(Person::getName).reversed());一页速记排序三件套:comparing起步、thenComparing加级、reversed倒序字段可能为 null → 必配Comparator.nullsLast(naturalOrder()),否则 NPEreversed()反转整条链,只反一级要局部包一层原地排用list.sort,保原列表用stream().sorted()数字字段用comparingInt,避免装箱方法引用是 Comparator 的最佳搭档:comparing(Person::getAge)一行起步永远别手写匿名 Comparator,除非逻辑真的无法用 comparing 表达
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

近场声全息复现:从阵列数据到声源成像的完整流程 2026/10/2 9:12:05

近场声全息复现:从阵列数据到声源成像的完整流程

简介:面向全息成像与近场声全息分析,这套MATLAB程序包借助声波干涉实现对三维声场的记录与重建,适宜声学检测、无损检测、近场声成像等方向的研究者、工程师和高年级学生参考。资源共10个文件,其中6个.m源码脚本、4个.txt辅助文档…

阅读更多 →
红外热成像建筑缺陷识别:700张图与YOLOv12训练实战 2026/10/2 9:11:59

红外热成像建筑缺陷识别:700张图与YOLOv12训练实战

简介:这是一份带标注的红外热成像建筑缺陷识别数据集,面向建筑质量检测、计算机视觉目标检测的研究人员与工程师,尤其适合希望使用YOLOv12等模型进行热成像缺陷自动识别训练的场景。数据集共1401个文件,包含700张红外JPG图像、700…

阅读更多 →
PVE下LXC容器直通硬盘搭建OMV轻量NAS完整指南 2026/10/2 9:11:59

PVE下LXC容器直通硬盘搭建OMV轻量NAS完整指南

前几天我把一台闲置的迷你主机刷成PVE,想把家里那几块旧硬盘统一管起来,折腾了一整晚之后,最终定下来的方案是:PVE宿主机上开一个LXC容器,在容器里装OpenMediaVault(简称OMV),再把一…

阅读更多 →
红外热成像建筑缺陷识别:YOLOv12数据集训练与精度复现指南 2026/10/2 9:11:59

红外热成像建筑缺陷识别:YOLOv12数据集训练与精度复现指南

简介:这份带标注的红外热成像建筑缺陷识别数据集,面向建筑质量检测、计算机视觉目标检测方向的研究者与工程师,配合YOLOv12训练流程使用,据标注信息训练可达到约91.5%的识别率,可用于墙体裂缝、渗漏、保温层脱落等典型…

阅读更多 →
CBA球员数据可视化分析系统:Python爬虫与Echarts实战 2026/10/2 9:11:58

CBA球员数据可视化分析系统:Python爬虫与Echarts实战

CBA球员数据可视化分析系统,这个项目用一句话概括就是:把CBA官网散落的球员比赛数据抓下来,清洗成结构化的数据表,再用Python配合Echarts做成一套能交互看图的Web系统。折腾完这套东西,你对爬虫、pandas数据处理和Web可…

阅读更多 →
Zynq-7020 AMP双核通信实战:Vitis 2023/2024平台搭建与共享内存中断实现 2026/10/2 9:11:58

Zynq-7020 AMP双核通信实战:Vitis 2023/2024平台搭建与共享内存中断实现

从一块Zynq-7020开发板到双核通信跑通,我前后折腾了快一个月。Vitis 2023.1、2023.2再到2024.1,每个版本都有各自的脾气。这篇文章就把我在这期间踩过的坑、验证过的方案、还有最终稳定运行的AMP双核通信实现,原原本本整理出来。这篇文章要解…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉