7.像使用SQL一样排序集合
最后更新于:2022-04-02 07:57:29
在开始之前,我先卖个关子提一个问题:我们现在有一个Employee员工类。
~~~
@Data
@AllArgsConstructor
public class Employee {
private Integer id;
private Integer age; //年龄
private String gender; //性别
private String firstName;
private String lastName;
}
~~~
你知道怎么对一个Employee对象组成的List集合,**先按照性别字段倒序排序,再按照年龄的倒序**进行排序么?如果您不知道4行代码以内的解决方案(其实是1行代码就可以实现,但笔者格式化为4行),我觉得您有必要一步步的看下去。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/47/61/476143ac65ff2f1d6bfc6b7f2c17c7e7_331x205.png)
## 一、字符串List排序
cities是一个字符串数组。**注意london的首字母是小写的。**
~~~java
List cities = Arrays.asList(
"Milan",
"london",
"San Francisco",
"Tokyo",
"New Delhi"
);
System.out.println(cities);
//[Milan, london, San Francisco, Tokyo, New Delhi]
cities.sort(String.CASE_INSENSITIVE_ORDER);
System.out.println(cities);
//[london, Milan, New Delhi, San Francisco, Tokyo]
cities.sort(Comparator.naturalOrder());
System.out.println(cities);
//[Milan, New Delhi, San Francisco, Tokyo, london]
~~~
* 当使用sort方法,按照String.CASE_INSENSITIVE_ORDER(字母大小写不敏感)的规则排序,结果是:[london, Milan, New Delhi, San Francisco, Tokyo]
* 如果使用Comparator.naturalOrder()字母自然顺序排序,结果是:[Milan, New Delhi, San Francisco, Tokyo, london]
同样我们可以把排序器Comparator用在Stream管道流中。
~~~
cities.stream().sorted(Comparator.naturalOrder()).forEach(System.out::println);
//Milan
//New Delhi
//San Francisco
//Tokyo
//london
~~~
在java 7我们是使用Collections.sort()接受一个数组参数,对数组进行排序。**在java 8之后可以直接调用集合类的sort()方法进行排序**。sort()方法的参数是一个比较器Comparator接口的实现类,Comparator接口的我们下一节再给大家介绍一下。
## 二、整数类型List排序
~~~swift
List numbers = Arrays.asList(6, 2, 1, 4, 9);
System.out.println(numbers); //[6, 2, 1, 4, 9]
numbers.sort(Comparator.naturalOrder()); //自然排序
System.out.println(numbers); //[1, 2, 4, 6, 9]
numbers.sort(Comparator.reverseOrder()); //倒序排序
System.out.println(numbers); //[9, 6, 4, 2, 1]
~~~
## 三、按对象字段对`List
';