![a403e06080ee5668c0d054c7163755a8.png](https://i-blog.csdnimg.cn/blog_migrate/aa588c638dddb2026b28645e45bb1fd3.jpeg)
一、概念
先来看下典型的比较器示例:
Comparator byName = new Comparator() { @Override public int compare(Developer o1, Developer o2) { return o1.getName().compareTo(o2.getName()); // name是String类型 }}复制代码
java8中引入了lambda表达式,比较器可以改成下面这样:
Comparator byName = (Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName());复制代码
对于数组,Arrays.sort()提供了传入比较器的重载方法,对于列表,Collections.sort()也提供了传入比较器的重载方法。
二、使用实例
2.1 通过new 新建比较器
假如我们要通过Developer 对象的年龄进行排序,通常情况下我们使用Collections.sort,new个匿名Comparator 类,类似下面这种:
import java.math.BigDecimal;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class TestSorting { public static void main(String[] args) { List listDevs = getDevelopers(); System.out.println("Before Sort"); for (Developer developer : listDevs) { System.out.println(developer); } //sort by age Collections.sort(listDevs, new Comparator() { @Override public int compare(Developer o1, Developer o2) { return o1.getAge() - o2.getAge(); } }); System.out.println("After Sort"); for (Developer developer : listDevs) { System.out.println(developer); } } private static List getDevelopers() { List result = new ArrayList(); result.add(new Developer("ricky", new BigDecimal("70000"), 33)); result.add(new Developer("alvin", new BigDecimal("80000"), 20)); result.add(new Developer("jason", new BigDecimal("100000"), 10)); result.add(new Developer("iris", new BigDecimal("170000"), 55)); return result; }}复制代码
输出结果:
Before SortDeveloper [name=ricky, salary=70000, age=33]Developer [name=alvin, salary=80000, age=20]Developer [name=jason, salary=100000, age=10]Developer [name=iris, salary=170000, age=55]After SortDeveloper [name=jason, salary=100000, age=10]Developer [name=alvin, salary=80000, age=20]Developer [name=ricky, salary=70000, age=33]Developer [name=iris, salary=170000, age=55]复制代码
当比较规则发生变化时,你需要再次new个匿名Comparator 类:
//sort by age Collections.sort(listDevs, new Comparator() { @Override public int compare(Developer o1, Developer o2) { return o1.getAge() - o2.getAge(); } }); //sort by name Collections.sort(listDevs, new Comparator() { @Override public int compare(Developer o1, Developer o2) { return o1.getName().compareTo(o2.getName()); } }); //sort by salary Collections.sort(listDevs, new Comparator() { @Override public int compare(Developer o1, Developer o2) { return o1.getSalary().compareTo(o2.getSalary()); } });复制代码
这样也可以,不过你会不会觉得这样有点怪,因为其实不同的只有一行代码而已,但是却需要重复写很多代码?
2.2 通过lambda表达式新建比较器
在java8中,List接口直接提供了排序方法, 所以你不需要使用Collections.sort:
//List.sort() since Java 8 listDevs.sort(new Comparator() { @Override public int compare(Developer o1, Developer o2) { return o2.getAge() - o1.getAge(); } });复制代码
Lambda改写:
import java.math.BigDecimal;import java.util.ArrayList;import java.util.List;public class TestSorting { public static void main(String[] args) { List listDevs = getDevelopers(); System.out.println("Before Sort"); for (Developer developer : listDevs) { System.out.println(developer); } System.out.println("After Sort"); //lambda here! listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge()); //java 8 only, lambda also, to print the List listDevs.forEach((developer)->System.out.println(developer)); } private static List getDevelopers() { List result = new ArrayList(); result.add(new Developer("ricky", new BigDecimal("70000"), 33)); result.add(new Developer("alvin", new BigDecimal("80000"), 20)); result.add(new Developer("jason", new BigDecimal("100000"), 10)); result.add(new Developer("iris", new BigDecimal("170000"), 55)); return result; }}复制代码
输出:
Before SortDeveloper [name=ricky, salary=70000, age=33]Developer [name=alvin, salary=80000, age=20]Developer [name=jason, salary=100000, age=10]Developer [name=iris, salary=170000, age=55]After SortDeveloper [name=jason, salary=100000, age=10]Developer [name=alvin, salary=80000, age=20]Developer [name=ricky, salary=70000, age=33]Developer [name=iris, salary=170000, age=55]复制代码
2.3 更多的例子
根据年龄:
//sort by age Collections.sort(listDevs, new Comparator() { @Override public int compare(Developer o1, Developer o2) { return o1.getAge() - o2.getAge(); } }); //lambda listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge()); //lambda, valid, parameter type is optional listDevs.sort((o1, o2)->o1.getAge()-o2.getAge());复制代码
根据名字:
//sort by name Collections.sort(listDevs, new Comparator() { @Override public int compare(Developer o1, Developer o2) { return o1.getName().compareTo(o2.getName()); } }); //lambda listDevs.sort((Developer o1, Developer o2)->o1.getName().compareTo(o2.getName())); //lambda listDevs.sort((o1, o2)->o1.getName().compareTo(o2.getName()));复制代码
根据薪水:
//sort by salary Collections.sort(listDevs, new Comparator() { @Override public int compare(Developer o1, Developer o2) { return o1.getSalary().compareTo(o2.getSalary()); } }); //lambda listDevs.sort((Developer o1, Developer o2)->o1.getSalary().compareTo(o2.getSalary())); //lambda listDevs.sort((o1, o2)->o1.getSalary().compareTo(o2.getSalary()))复制代码
从小到大排序:
Comparator salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary()); listDevs.sort(salaryComparator);复制代码
从大到小倒序:
Comparator salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary()); listDevs.sort(salaryComparator.reversed());//Comparator salaryComparator = (o1, o2)->o2.getSalary().compareTo(o1.getSalary());
作者:thulongkang
链接:https://juejin.cn/post/6898898464252690446
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。