现在有一个类
public class Person {private int id;private int age;private String name;public Person(int id, int age, String name) {this.id = id;this.age = age;this.name = name;}public int getId() {return id;}public int getAge() {return age;}public String getName() {return name;}@Overridepublic String toString() {return "Person{" +"id=" + id +", age=" + age +", name='" + name + '\'' +'}';}}
一个列表
public class Test {public static void main(String[] args) {List<Person> list = new ArrayList<Person>() {{add(new Person(1, 30, "北京"));add(new Person(2, 20, "西安"));add(new Person(3, 40, "上海"));}};}}
我们对该列表进行排序,则有如下两种最常用的方法
一、继承 Comparable 接口
我们让 Person 类实现 Comparable 接口,重写 compareTo 方法
public class Person implements Comparable<Person>{private int id;private int age;private String name;public Person(int id, int age, String name) {this.id = id;this.age = age;this.name = name;}public int getId() {return id;}public int getAge() {return age;}public String getName() {return name;}@Overridepublic String toString() {return "Person{" +"id=" + id +", age=" + age +", name='" + name + '\'' +'}';}@Overridepublic int compareTo(Person person) {//这是从小到大排序,如果是person.getAge() - this.getAge() 则是从大到小排序return this.getAge() - person.getAge();}
}
调用 Collections.sort(list) 方法进行排序
public class Test {public static void main(String[] args) {List<Person> list = new ArrayList<Person>() {{add(new Person(1, 30, "北京"));add(new Person(2, 20, "西安"));add(new Person(3, 40, "上海"));}};Collections.sort(list);list.forEach(person -> System.out.println(person));}}
运行结果
二、使用 Comparator比较器 排序
使用 Comparator比较器 无序修改原有的类,更加方便
我们查看 Collections 的 sort 方法
这边第二个参数就是我们要传入的比较器 Comparator
查看比较器源码
我们看到 比较器 是一个接口,且有 @FunctionalInterface 注解,表明是函数式接口,者我们可以直接使用 Lambda 表达式
Person 类无需再额外实现接口
public class Person{private int id;private int age;private String name;public Person(int id, int age, String name) {this.id = id;this.age = age;this.name = name;}public int getId() {return id;}public int getAge() {return age;}public String getName() {return name;}@Overridepublic String toString() {return "Person{" +"id=" + id +", age=" + age +", name='" + name + '\'' +'}';}
}
直接使用 Comparator 比较器 如下
public class Test {public static void main(String[] args) {List<Person> list = new ArrayList<Person>() {{add(new Person(1, 30, "北京"));add(new Person(2, 20, "西安"));add(new Person(3, 40, "上海"));}};Collections.sort(list,(Person person1,Person person2) -> {return person1.getAge() - person2.getAge();});list.forEach(person -> System.out.println(person));}}
接着我们看 idea 将比较器置灰,并提示 Can be replaced with 'Comparator.comparingInt'
因为 Comparator 已经有现成的 从小到大排序 方法,直接Replace
Collections.sort(list, Comparator.comparingInt(Person::getAge));
运行结果正确