这是我的清单:
ENAMETOOLONG
我希望按fs
排序,如果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
。但到目前为止,我只能使用Lambda表达式按一个属性排序:
Age
如果我尝试
Name
它结果是错误......
答案 0 :(得分:15)
将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;
});
答案 1 :(得分:13)
您可以使用静态方法Comparator.comparing
基于返回可比较值的函数创建比较器。这样的比较器可以与其他比较器链接。
假设您的类型名为Person,您将拥有:
Comparator<Person> c = Comparator
.comparing(p -> p.getGroup())
.thenComparing(p -> p.getAge())
.thenComparing(p -> p.getName())
如果任何getter返回基本类型,则必须分别使用 - 例如 - comparingInt
和thenComparingInt
。您还可以使用方法引用:
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;
});