属性排序空值问题处理

young 537 2021-11-15
@Data
public static class ProjectFileType {
   private String value;
   private String name;
   private Integer order;
}

针对ProjectFileType这个类,在返回给前端时需要通过order进行排序处理

考虑到order字段可能为空,使用了nullsLast处理

List<ProjectFileType> list;

list.sort(Comparator.nullsLast(Comparator.comparing(ProjectFileType::getOrder)));

当order为空时,依旧会出现空指针错误

此时意识到外层的nullsLast是针对整个对象的控制,避免判断过程中出现空指针,应对内侧order进行处理

list.sort(Comparator.nullsLast(Comparator.comparing(ProjectFileType::getOrder,Comparator.nullsLast(Comparator.comparing(e->e)))));

此时可正确输出我们期望的结果

如果多个字段都需要进行这种空值处理的话,代码会显得很臃肿

此时可以采用Apache commons-collections对要排序的字段做处理

引入相关依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>

创建NullComparator对象并使用

private static final NullComparator<Integer> nullComparator = new NullComparator<>();

list.sort(Comparator.nullsLast(Comparator.comparing(ProjectFileType::getOrder,nullComparator)));

NullComparator默认将null值排在最后,如果希望将null值数据拍在前面,可在创建时传入相关参数new NullComparator<>(true)