Java使用Comparator.nullsLast排序Map<String,Object>抛出NPE如何解决
问题原因分析
- 你当前代码抛出NPE的核心原因是:
nullsLast仅能处理比较器转换函数返回的null值、或是待排序的元素本身为null的场景,不会捕获转换函数内部抛出的异常。你在转换函数中直接把可能为null的键传入Double.valueOf(),该方法入参为null时会直接抛出空指针异常,还没走到nullsLast的处理逻辑就报错了。 - 同时如果你的实际需求是按
Map中键对应的值排序,原代码写死取getKey()也不符合要求,需要对应调整取值逻辑。
适配需求的代码方案
根据两种常用场景给出对应实现:
场景1:对Map.Entry(键值对)集合按键的数值大小排序
import static java.util.Comparator.*; // 适配所有约束的排序比较器 Comparator<Map.Entry<String, Object>> sortByKeyComparator = nullsLast(comparing(entry -> { String key = entry.getKey(); // 提前处理key为null的情况,返回null交给nullsLast处理 if (key == null) { return null; } return Double.valueOf(key); }));
场景2:对多个Map<String, Object>实例按指定键对应的值的数值大小排序
import static java.util.Comparator.*; // 替换为你实际用来排序的键名 String targetSortKey = "sortField"; Comparator<Map<String, Object>> sortByValComparator = nullsLast(comparing(map -> { Object value = map.get(targetSortKey); if (value == null) { return null; } // 按约束同一时间所有值类型一致,无需兼容混合类型 if (value instanceof Number) { return ((Number) value).doubleValue(); } // 处理可转数字的字符串类型 return Double.valueOf(value.toString()); }));
逻辑说明
- 提前在转换函数中判断待转换的内容是否为
null,null直接返回,后续由nullsLast自动把对应元素排到所有非null元素的末尾 - 兼容了
Integer/Double类型的取值、以及可转换为数字的字符串类型的解析逻辑,完全符合给出的约束条件
内容的提问来源于stack exchange,提问作者moovon
相关产品推荐
相关产品推荐

