Java中List排序的3种⽅法!
在某些特殊的场景下,我们需要在 Java 程序中对 List 集合进⾏排序操作。List 排序的常见⽅法有以下 3 种:使⽤ Comparable 进⾏排序;
使⽤ Comparator 进⾏排序;
如果是 JDK 8 以上的环境,也可以使⽤ Stream 流进⾏排序。
下⾯我们分别来看各种排序⽅法的具体实现。
新建实体类如下:
//以下 set/get/toString 使⽤的是 lombok 的注解
@Getter
@Setter
@ToString
class Person  implements Comparable<Person> {
private Integer age;
private String name;
public Person(Integer age, String name)  {
this.age = age;
this.name = name;
}
@Override
public int compareTo(Person p) {
Age() - Age();
}
}
1.使⽤ Comparable 排序
class  TestDemo{
public static void main(String[] args) {
// 创建并初始化 List
List<Person> list = new ArrayList<Person>() {{
add(new Person(30, "Jesse"));
add(new Person(10, "luxi"));
add(new Person(40, "Jack"));
      }};
// 使⽤ Comparable ⾃定的规则进⾏排序
    Collections.sort(list);
/
/ 打印 list 集合
list.forEach(p -> {
System.out.println(p);
});
}
}
2.使⽤ Comparator 排序
/**
* 新建 Person ⽐较器
*/
class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
Age() - p1.getAge();
}
}
class  TestDemo{
public static void main(String[] args) {
// 创建并初始化 List
List<Person> list = new ArrayList<Person>() {{
add(new Person(30, "Jesse"));
add(new Person(10, "luxi"));
add(new Person(40, "Jack"));
}};
    //新建 Person ⽐较器
    Collections.sort(list,new PersonComparator());
      //或者
// 使⽤匿名⽐较器排序
Collections.sort(list, new Comparator<Person>() {
java集合排序怎么实现@Override
public int compare(Person p1, Person p2) {
Age() - p1.getAge();
}
});
   // 打印 list 集合
list.forEach(p -> { System.out.println(p); });
} } 
3.使⽤ Stream 流排序
class  TestDemo{
public static void main(String[] args) {
// 创建并初始化 List
List<Person> list = new ArrayList<Person>() {{
add(new Person(30, "Jesse"));
add(new Person(10, "luxi"));
add(new Person(40, "Jack"));
add(new Person(null, "marry"));
      }};
// 使⽤ Stream 排序,但是年龄中有个null,所以会报错
list = list.stream().sorted(Comparatorparing(Person::getAge).reversed())
.List());
//java8排序(正确)
// 按照[年龄]正序,但年龄中有⼀个 null 值
list.stream().sorted(Comparatorparing(Person::getAge,
Comparator.nullsFirst(Integer::compareTo)).reversed())
.List());
/
/ 打印 list 集合
list.forEach(
p -> { System.out.println(p);
});
}
} 
  总结:
其中 reversed() 表⽰倒序的意思,如果不使⽤此⽅法则是正序。
  JDK 8 之后的版本,就可以使⽤ Comparatorparing 实现排序,如果排序字段中可能出现 null 值,要使⽤ Comparator.nullsXXX 进⾏排序处理(否则会报错)。