thenComparing没生效是因为未使用其返回的新比较器,必须赋值或直接传给sort();需注意null处理、大小写敏感、升/降序显式声明及自定义比较器的完整性。
多条件排序时
为什么没生效?
因为比较器链没真正“串联”起来——
返回的是新比较器,但你没把它赋值或传给
。常见写法错误是只调用不接收:
然后扔掉返回值。
必须把最终链式结果传给
或
,例如:
如果用静态方法构造,得从
开始,比如:
注意 null 值:默认不处理 null,遇到
会抛
;要用
显式控制
字符串字段排序时大小写敏感导致顺序错乱
直接用
比较,
和
会因 ASCII 码大小写差异排错(大写字母在小写前)。
改用
:
或者用 lambda +
(注意 null 安全):
避免在比较逻辑里做耗时操作(如反复调用
),大数据量时建议预处理或用
数值字段升序/降序混排容易搞反方向
默认升序,想对某字段降序就得显式翻转,不能靠“多写几个 then”来猜。
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
升序直接用:
降序必须套
:
或更清晰地写成:
链式中混用方向时,推荐每段都显式声明方向,比如:
—— 注意最后的
是作用在整个链上的,不是仅对
自定义对象字段比较时
频发
当某个字段可能为
(如
),又没配置 null 处理策略,
一调就崩。
立即学习
“
Java免费学习笔记(深入)
”;
统一用
或
包装比较器:
如果字段类型本身不支持自然比较(如自定义类),必须提供完整比较器,不能只传方法引用:
别依赖 IDE 自动生成的
,它不会帮你加 null 安全,得自己补
实际写的时候,最容易被忽略的是链式调用的**返回值归属**和**null 策略的一致性**——前者导致排序完全不生效,后者让线上偶尔报空指针,查起来特别费时间。
thenComparingthenComparingsort()comparator.thenComparing(...)Collections.sort()List.sort()list.sort(comparator.thenComparing(...))Comparator.comparing()Comparator.comparing(User::getAge).thenComparing(User::getName)nullNullPointerExceptionthenComparing(Comparator.nullsLast(...))User::getName"Alice""bob"String.CASE_INSENSITIVE_ORDERthenComparing(User::getName, String.CASE_INSENSITIVE_ORDER)toLowerCase()thenComparing(u -> u.getName() != null ? u.getName().toLowerCase() : "")toLowerCase()CollatorthenComparingthenComparing(User::getScore)reversed()thenComparing(User::getScore).reversed()thenComparing(Comparator.comparing(User::getScore).reversed())comparing(User::getDept).thenComparing(User::getScore).thenComparing(User::getLevel).reversed()reversed()levelNullPointerExceptionnullUser::getNicknamethenComparingnullsFirst()nullsLast()thenComparing(Comparator.nullsLast(Comparator.comparing(User::getNickname)))thenComparing(Comparator.nullsLast((a, b) -> a.getMeta().compareTo(b.getMeta())))comparing