Comparator篇
1 import java.util.Arrays; 2 import java.util.Comparator; 3 4 public class UserComparator { 5 6 public static void main(String[] args) { 7 8 /** 9 * Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足要求时,可写一个比较器来完成两个对象之间大小的比较。 10 * Comparator体现了一种策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。 11 * 12 */ 13 14 // 一组数字需要对其进行正序排序,java8之前我们通常的做法是: 15 Integer[] values1 = new Integer[]{1, 0, 3, 5, 7, 8, 5, 4, 3, 7, 9, 56, 3, 23}; 16 Arrays.sort(values1, new Comparator<Integer>() { 17 @Override 18 public int compare(Integer value1, Integer value2) { 19 return value1 - value2; 20 } 21 }); 22 // 而在java8中,由于新增lambda表达式,我们可以很简洁的使用如下的方式: 23 Integer[] values2 = new Integer[]{1, 0, 3, 5, 7, 8, 5, 4, 3, 7, 9, 56, 3, 23}; 24 Arrays.sort(values2, (x, y) -> x - y); 25 // jdk甚至为了排序做了一些定制的方法,比如上面的代码可以写成如下的方式,更加让人容易理解: 26 Integer[] values3 = new Integer[]{1, 0, 3, 5, 7, 8, 5, 4, 3, 7, 9, 56, 3, 23}; 27 Arrays.sort(values3, Comparator.comparingInt(x -> x)); 28 29 30 // reversed():这个方法是用来生成一个逆序器,比如我们开始需要得到一个正序的排序序列,然后又想得到一个反转的排序序列,就可以使用该方法 31 Integer[] values = new Integer[]{1, 0, 3, 5, 7, 8, 5, 4, 3, 7, 9, 56, 3, 23}; 32 Comparator<Integer> comparator = Comparator.comparingInt(x -> x); 33 Arrays.sort(values, comparator); 34 System.out.println(JSON.toJSONString(values)); // [0,1,3,3,3,4,5,5,7,7,8,9,23,56] 35 Arrays.sort(values, comparator.reversed()); 36 System.out.println(JSON.toJSONString(values)); // [56,23,9,8,7,7,5,5,4,3,3,3,1,0] 37 38 39 // thenComparing(Comparator<? super T> other):该方法是在原有的比较器上再加入一个比较器,比如我们有一些用户,在对其进行排序的时候, 40 // 我们首先对他的名字长度进行排序,然后再对他的年龄进行排序 41 Person[] persons = new Person[]{ 42 new Person(22, "zhangsan"), 43 new Person(23, "lisi"), 44 new Person(23, "wangwu"), 45 new Person(22, "wangwu"), 46 new Person(22, "lisi"), 47 new Person(23, "zhangsan") 48 }; 49 System.out.println(JSON.toJSONString(persons)); 50 Comparator<Person> comparator = Comparator.comparingInt(x -> x.getName().length()); 51 Arrays.sort(persons, comparator); 52 System.out.println(JSON.toJSONString(persons)); 53 comparator = comparator.thenComparing(Comparator.comparingInt(Person::getAge)); 54 Arrays.sort(persons, comparator); 55 System.out.println(JSON.toJSONString(persons)); 56 // 输出结果如下: 57 // [{"age":22,"name":"zhangsan"},{"age":23,"name":"lisi"},{"age":23,"name":"wangwu"},{"age":22,"name":"wangwu"},{"age":22,"name":"lisi"},{"age":23,"name":"zhangsan"}] 58 // [{"age":23,"name":"lisi"},{"age":22,"name":"lisi"},{"age":23,"name":"wangwu"},{"age":22,"name":"wangwu"},{"age":22,"name":"zhangsan"},{"age":23,"name":"zhangsan"}] 59 // [{"age":22,"name":"lisi"},{"age":23,"name":"lisi"},{"age":22,"name":"wangwu"},{"age":23,"name":"wangwu"},{"age":22,"name":"zhangsan"},{"age":23,"name":"zhangsan"}] 60 61 // 简化写法如下: 62 Comparator<Person> comparator = Comparator.comparing(Person::getName).thenComparing(Person::getAge); 63 Arrays.sort(persons, comparator); 64 } 65 }