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());
}