1. Java8 List排序核心方法解析
刚接触Java8的开发者经常会困惑:为什么List接口突然多了个sort()方法?这其实是Java8引入的默认方法(default method)特性带来的改变。与传统的Collections.sort()相比,List.sort()不仅语法更简洁,还完美支持Lambda表达式,让排序代码变得更加优雅。
我在实际项目中发现,90%的排序场景都可以用以下三种方式解决:
java复制// 1. 自然排序(Comparable)
list.sort(null);
// 2. 比较器排序(Comparator)
list.sort(Comparator.comparing(Person::getName));
// 3. 链式比较
list.sort(Comparator.comparing(Person::getDepartment)
.thenComparing(Person::getSalary));
1.1 自然排序的实现原理
当调用list.sort(null)时,实际上触发的是元素的自然排序。这要求列表元素必须实现Comparable接口,就像String和Integer这些JDK类已经做的那样。我遇到过新手直接对自定义对象调用这个方法导致ClassCastException的案例,根本原因就是忘了实现Comparable。
实现Comparable的典型模板:
java复制class Product implements Comparable<Product> {
private String name;
private double price;
@Override
public int compareTo(Product other) {
return Double.compare(this.price, other.price);
}
}
关键提示:Double.compare()处理浮点数比直接相减更安全,能避免NaN和Infinity带来的问题
1.2 比较器(Comparator)的进化史
Java8之前的Comparator写法相当冗长:
`
