簡體   English   中英

使用Lambda表達式對多個屬性進行排序

[英]Sorting multiple attribute with Lambda Expressions

這是我的清單:

Name: Ben     || Age: 5 || Group: 1
Name: Andy    || Age: 6 || Group: 2
Name: Charlie || Age: 6 || Group: 2
Name: Ben     || Age: 5 || Group: 1
Name: Andy    || Age: 5 || Group: 2
Name: Charlie || Age: 5 || Group: 1

我想按Group排序列表,如果Group等於然后按Age排序,如果Age等於然后按Name排序。 但是到目前為止,我只能使用Lambda表達式按一個屬性排序:

list.sort((Object o1, Object o2) -> o1.getGroup().compareTo(o2.getGroup()));

如果我嘗試

o1.getGroup().compareTo(o2.getGroup()) && o1.getAge().compareTo(o2.getAge())

原來是錯誤...

將lambda 表達式更改為lambda {block} ,而不必指定參數類型:

list.sort((o1, o2) -> {
    int cmp = o1.getGroup().compareTo(o2.getGroup());
    if (cmp == 0)
        cmp = Integer.compare(o1.getAge(), o2.getAge());
    if (cmp == 0)
        cmp = o1.getName().compareTo(o2.getName());
    return cmp;
});

您可以使用靜態方法Comparator.comparing基於返回可比較值的函數創建比較器。 這樣的比較器可以與其他鏈接在一起。

假設您的類型稱為“人”,您將具有:

Comparator<Person> c = Comparator
        .comparing(p -> p.getGroup())
        .thenComparing(p -> p.getAge())
        .thenComparing(p -> p.getName())

如果任何干將返回一個基本類型,你必須使用-例如- comparingIntthenComparingInt分別。 您還可以使用方法引用:

Comparator<Person> c = Comparator
        .comparing(Person::getGroup)
        .thenComparing(Person::getAge)
        .thenComparing(Person::getName)

但是...如果您的類根據這些值具有自然順序 ,則最好讓它實現Comparable接口並在其中編寫比較邏輯:

class Person implements Comparable<Person> {
    ...
    @Override
    public int compareTo(Person other) {
        int compare = Integer.compare(getGroup(), other.getGroup());
        if (compare == 0) {
            compare = Integer.compare(getAge(), other.getAge());
        }
        if (compare == 0) {
            compare = getName.compareTo(other.getName());
        }
        return compare;
    }
}

此代碼段也可以在lambda表達式中使用:

list.sort((o1, o2) -> {
    int compare = Integer.compare(o1.getGroup(), o2.getGroup());
    if (compare == 0) {
        compare = Integer.compare(o1.getAge(), o2.getAge());
    }
    if (compare == 0) {
        compare = o1.getName.compareTo(o2.getName());
    }
    return compare;
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM