◉◡◉ 您好,欢迎到访伊成个人站!

Java8中列表的排序(升序、降序)

写在前面

还记得几年前,那时候查询数据基本都是在数据库中把查询的数据做好排序。举个栗子,在查询User表的时候按照创建时间升序查询出来。

时过境迁,现在的项目中采用了Spring Data JPa,当然也支持排序。但本文中的主角可不是它,在很多情况下我们查询出来的List数据没有排序好或是需要二次按照某字段排序,这个时候,我们就可以使用Java8对其排序。

首先,看个基础语法,如下:

单个字段排序

1
2
3
4
5
6
7
8
9
10
11
12
List<类> list; 代表某集合

//返回 对象集合以类属性一升序排序
list.stream().sorted(Comparator.comparing(类::属性一));

/**
* 返回 对象集合以类属性一降序排序 注意两种写法
**
//先以属性一升序,结果进行属性一降序
list.stream().sorted(Comparator.comparing(类::属性一).reversed());
//以属性一降序
list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder()));

多个字段排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 返回 对象集合以类属性一升序 属性二升序
list.stream().sorted(Comparator.comparing(类::属性一).thenComparing(类::属性二));


//先以属性一升序,升序结果进行属性一降序,再进行属性二升序
list.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二));

//先以属性一降序,再进行属性二升序
list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder()).thenComparing(类::属性二));

/**
* 返回 对象集合以类属性一降序 属性二降序 注意两种写法
**/

//先以属性一升序,升序结果进行属性一降序,再进行属性二降序
list.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二,Comparator.reverseOrder()));
//先以属性一降序,再进行属性二降序
list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder()).thenComparing(类::属性二,Comparator.reverseOrder()));

/**
* 返回 对象集合以类属性一升序 属性二降序 注意两种写法
**/

//先以属性一升序,升序结果进行属性一降序,再进行属性二升序,结果进行属性一降序属性二降序
list.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二).reversed());

//先以属性一升序,再进行属性二降序
list.stream().sorted(Comparator.comparing(类::属性一).thenComparing(类::属性二,Comparator.reverseOrder()));

实例代码

1
2
3
4
5
//根据User对象的id字段降序排序
userList.sort(Comparator.comparing(User::getId).reversed());

//根据User对象的id字段降序排序
userList.sort(User::getId,Comparator.reverseOrder());

小结

通过以实例代码我们可以发现

写法一: Comparator.comparing(类::属性一).reversed();

写法二: Comparator.comparing(类::属性一,Comparator.reverseOrder());

两种排序是完全不一样的,一定要区分开来。

写法一是得到排序结果后再排序;

写法二是直接进行排序,很多人会混淆导致理解出错,但写法二更好理解,建议使用写法二。

完整例子demo

最后贴一个完整的例子,供大家参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static void main(String[] args) {
User user1 = new User(22,"张X");
User user2 = new User(27,"李X");
User user3 = new User(21,"王X");
User user4 = new User(18,"赵X");
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
for(User u :list){
System.out.println(u);
}

List<User> newList = list.stream().sorted(Comparator.comparing(User::getAge))
            .collect(Collectors.toList());
for(User u :newList){
System.out.println(u);
}
}

@Data
class User {
private int age;
private String name;
}

支付宝打赏 微信打赏