使用Comparator.nullsFirst/Last结合reverse()排序无效的问题咨询
问题分析与解决方案
你的核心问题是多次调用reversed()导致整个比较器链的逻辑被反转,抵消了nullsLast的效果。reversed()是对当前整个比较器链进行反转,而不是只反转最后一个排序维度,这会让你原本设置的nullsLast逻辑完全失效,导致null价格跑到前面。
修正后的代码
cars.stream() .sorted(Comparator.comparingInt((Car car) -> car.getCarMetadata().getCarType().getPriority()) // 价格升序,null排末尾 .thenComparing((Car car) -> car.getCarMetadata().getPrice(), Comparator.nullsLast(Double::compareTo)) // 年龄从新到旧(假设getAge()返回值越大车越旧,用reverseOrder()反转) .thenComparing((Car car) -> car.getAge(), Comparator.reverseOrder())) .collect(Collectors.toList());
关键说明
- 类型排序:直接用
comparingInt按priority自然升序排列,符合你的第一需求。 - 价格排序:使用
Comparator.nullsLast(Double::compareTo),确保非null价格按升序排列,null价格直接排到同类型的末尾,不会被后续反转影响。 - 年龄排序:单独对年龄维度使用
Comparator.reverseOrder(),实现“从新到旧”的需求——如果你的getAge()返回的是生产时间戳(数值越大越新),则去掉reverseOrder(),直接用自然序即可。
原代码的错误点
你在价格排序后调用了.reversed(),这会把类型+价格的整个比较逻辑反转,原本nullsLast让null在后面,反转后null反而跑到了前面;之后又对整个链再次反转,进一步打乱了排序逻辑,最终导致null始终排在前列。
内容的提问来源于stack exchange,提问作者N.A
相关产品推荐
相关产品推荐

