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

这是我的清单:

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

事实certificate错误……

将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基于返回可比值的函数创建比较器。 这种比较器可以与其他比较器链接。

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

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

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

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

但是……如果你的类根据这些值有一个自然的顺序 ,你最好让它实现Comparable接口并在那里写比较逻辑:

 class Person implements Comparable { ... @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; });