Java8实现联合排序

发布时间 2023-08-22 15:35:32作者: 谜一样的心Max
Comparator<MyObject> combined =
    Comparator.comparing(MyObject::getField1, Comparator.nullsLast(Comparator.naturalOrder()))
    .thenComparing(MyObject::getField2, Comparator.nullsLast(Comparator.naturalOrder()))
    .thenComparing(MyObject::getField3, Comparator.nullsLast(Comparator.naturalOrder()));
这将导致一个Comparator首先按field1排序;如果其中一个比较对象包含null,则它将被排序在另一个对象之后(nullsLast)。如果两个对象的字段都是null,则将计算下一个字段(thenComparing()),直到到达field3

当然,您可以创建一个助手方法
private static Comparator<MyObject> compareField(Function<MyObject, String> fieldExtractor) {
    return Comparator.comparing(fieldExtractor, Comparator.nullsLast(Comparator.naturalOrder()));
}
//.reversed()倒序
//.Comparator.nullsLast(Comparator.naturalOrder())) 如果为null不排序
            List<TmProjectTechniqueDetail> detailss = new ArrayList<>();
            if(!CollectionUtils.isEmpty(details)){
                detailss = details.stream().sorted(Comparator.comparing(TmProjectTechniqueDetail::getStatus).reversed()
                        .thenComparing(TmProjectTechniqueDetail::getFinishTime)
                        .thenComparing(TmProjectTechniqueDetail::getCreateTime)
                        .thenComparing(TmProjectTechniqueDetail::getActualTime,Comparator.nullsLast(Comparator.naturalOrder()))).collect(Collectors.toList());
            }