按字段排序对象列表,如果为空,则按另一个字段排序

时间:2019-07-17 09:58:02

标签: java list sorting

我有一个对象列表DealPortafoglio。该对象具有三个字段:keySum1,keySum2和key。我想按keySum1排序列表,如果它为null,则按keySum2排序。 如何使用可比接口来做到这一点? 预先谢谢你

此刻,我发现的唯一方法是将列表分成两个列表(一个带有keySum1!= null,另一个带有keySum1 = null和keySum2!= null)并分别对其进行排序。

1 个答案:

答案 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));