如果你赶时间:
1 | list.sort((Developer o1, Developer o2) -> Integer.compare(o1.getAge(), o2.getAge())); // 显式类型 |
一、概念
先来看下典型的比较器示例:
1 | Comparator<Developer> byName = new Comparator<Developer>() { |
Java8
中引入了Lambda
表达式,比较器可以改成下面这样:
1 | Comparator<Developer> byName = (Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName()); |
对于数组,Arrays.sort()
提供了传入比较器的重载方法,对于列表,Collections.sort()
也提供了传入比较器的重载方法。
二、使用实例
2.1 通过new
新建比较器
假如我们要通过Developer 对象的年龄进行排序,通常情况下我们使用Collections.sort,new个匿名Comparator 类,类似下面这种:
1 | import java.math.BigDecimal; |
输出结果:
1 | Before Sort |
当比较规则发生变化时,你需要再次new个匿名Comparator 类:
1 | //sort by age |
这样也可以,不过你会不会觉得这样有点怪,因为其实不同的只有一行代码而已,但是却需要重复写很多代码?
2.2 通过Lambda表达式新建比较器
在java8
中,List
接口直接提供了排序方法, 所以你不需要使用Collections.sort:
1 | //List.sort() since Java 8 |
Lambda
改写:
1 | import java.math.BigDecimal; |
输出:
1 | Before Sort |
2.3 更多的例子
根据年龄:
1 | //sort by age |
根据名字:
1 | //sort by name |
根据薪水:
1 | //sort by salary |
从小到大排序:
1 | Comparator<Developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary()); |
从大到小倒序:
1 | Comparator<Developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary()); |
本文虽然大部分是转载,但关于Integer
类型的数值比较防止溢出问题,以及对compare()
方法的设计均有重要注解,因此归类为二创。
参考:
java8-Lambda中比较器Comparator的使用 - CSDN
java8-Lambda中比较器Comparator的使用 - 掘金
Java8 Lambda表达式(二)System.out::println与Lambda表达式
原文链接: https://xqtony.github.io/2023/05/26/lambda in Comparator/
版权声明: 转载请注明出处.