现在有一个类
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; } @Override public 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; } @Override public String toString() { return "Person{" + "id=" + id + ", age=" + age + ", name='" + name + '\'' + '}'; } @Override public 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; } @Override public 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));
运行结果正确