使用Lambda表达式对多个属性进行排序

7 java lambda java-8

这是我的清单:

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
Run Code Online (Sandbox Code Playgroud)

我想对列表进行排序Group,如果Group等于那么Age,如果Age是等于那么Name.但到目前为止,我只能使用Lambda表达式按一个属性排序:

list.sort((Object o1, Object o2) -> o1.getGroup().compareTo(o2.getGroup()));
Run Code Online (Sandbox Code Playgroud)

如果我试试

o1.getGroup().compareTo(o2.getGroup()) && o1.getAge().compareTo(o2.getAge())
Run Code Online (Sandbox Code Playgroud)

事实证明错误......

And*_*eas 16

将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;
});
Run Code Online (Sandbox Code Playgroud)

  • @HuyVo在这里感谢某人的正确方法是提出他们的答案. (4认同)

See*_*ose 13

您可以使用静态方法Comparator.comparing基于返回可比值的函数创建比较器.这种比较器可以与其他比较器链接.

假设您的类型名为Person,您将拥有:

Comparator<Person> c = Comparator
        .comparing(p -> p.getGroup())
        .thenComparing(p -> p.getAge())
        .thenComparing(p -> p.getName())
Run Code Online (Sandbox Code Playgroud)

如果任何getter返回基本类型,则必须分别使用 - 例如 - comparingIntthenComparingInt.您还可以使用方法引用:

Comparator<Person> c = Comparator
        .comparing(Person::getGroup)
        .thenComparing(Person::getAge)
        .thenComparing(Person::getName)
Run Code Online (Sandbox Code Playgroud)

但是......如果你的类根据这些值有一个自然的顺序,你最好让它实现接口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;
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码段也可用于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;
});
Run Code Online (Sandbox Code Playgroud)