我有一个对象列表DealPortafoglio。该对象具有三个字段:keySum1,keySum2和key。我想按keySum1排序列表,如果它为null,则按keySum2排序。 如何使用可比接口来做到这一点? 预先谢谢你
此刻,我发现的唯一方法是将列表分成两个列表(一个带有keySum1!= null,另一个带有keySum1 = null和keySum2!= null)并分别对其进行排序。
答案 0 :(得分:0)
您可以将Comparator.nullsLast()
与Comparator.thenComparing()
结合使用。
例如
@Data
class MyObject {
private String field1;
private String field2;
private String field3;
}
您可以这样创建Comparator
:
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
,而比较对象之一包含null
,则将其排序为另一个(nullsLast
)。如果两个对象的字段均为null
,则将评估下一个字段(thenComparing()
),直到到达field3
。
您当然可以创建一个辅助方法
private static Comparator<MyObject> compareField(Function<MyObject, String> fieldExtractor) {
return Comparator.comparing(fieldExtractor, Comparator.nullsLast(Comparator.naturalOrder()));
}
因此您的组合比较器定义更短:
Comparator<MyObject> combined =
compareField(MyObject::getField1)
.thenComparing(compareField(MyObject::getField2))
.thenComparing(compareField(MyObject::getField3));