你可以使用静态方法
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;
});