Stream排序的api的真是简洁好用!
先说结论:
- Stream表达式可以对集合根据某个字段进行排序且默认为升序,而为null的对象会放在最后。
- 支持多字段排序
- 要想降序排序且null还是在最后,可构造
nullsFirst
认为先把null放在前面,再构造reversed()
反转则null还是在集合的最后,并且集合是按照这个字段降序排序了。
- 以1个字段排序时有2种写法是因为注意是Comparator构造地不同!=>所以写代码点点点的时候注意
.reversed()
这个函数的位置- 如果在多字段的整个
Comparator
外面则会整体倒序!=> 所以推荐使用上面第一种写法不然多条件时候会将整个链表表反转。
测试类如下(自己测试直接复制即可)
package com;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class StreamOrderTest {
public static void main(String[] args) {
User user1 = new User("a",10,999.0);
User user2 = new User("b",11,300.0);
User user3 = new User("c",12,null);
User user4 = new User("d",null,100.0);
List<User> list = new ArrayList<>();
list.add(new User("b",11,100.0));
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
list.add(new User("e",null,200.0));
list.add(new User("e",null,50.0));
System.out.println("原始集合:");
list.forEach(System.out::println);
//1、对年龄进行升序排序,并且age为null的对象会放到最后
List<User> ageOrderList = list.stream().sorted(
Comparator.comparing(User::getAge, Comparator.nullsLast(Integer::compareTo)))
.collect(Collectors.toList());
System.out.println("ageOrderList:");
ageOrderList.forEach(System.out::println);
//2、对年龄进行降序排序,并且age为null的对象会放到最后(注意这里用的是nullsFirst即代表把null值放在前面)
List<User> ageOrderDescList = list.stream().sorted(
Comparator.comparing(User::getAge,Comparator.nullsFirst(Integer::compareTo)).reversed())
.collect(Collectors.toList());
System.out.println("ageOrderDescList:");
ageOrderDescList.forEach(System.out::println);
//2、对年龄进行降序排序,并且age为null的对象会放到最后 第二种写法(注意这里 .reversed()的位置与上一个写法不同)
//
List<User> ageOrderDescList2 = list.stream().sorted(
Comparator.comparing(User::getAge,Comparator.nullsFirst(Integer::compareTo).reversed()))
.collect(Collectors.toList());
System.out.println("ageOrderDescList2:");
ageOrderDescList2.forEach(System.out::println);
//3、对年龄进行升序排序,并且age为null的对象会放到最后 再对财富进行排序(包括年龄为null的那些对象)
List<User> ageWealthOrderList = list.stream().sorted(
Comparator.comparing(User::getAge, Comparator.nullsLast(Integer::compareTo))
.thenComparing(User::getWealth, Comparator.nullsLast(Double::compareTo).reversed()))
.collect(Collectors.toList());
System.out.println("ageWealthOrderList:");
ageWealthOrderList.forEach(System.out::println); }
static class User{
private String name;
private Integer age;
private Double wealth;
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public User(String name, Integer age, Double wealth) {
this.name = name;
this.age = age;
this.wealth = wealth;
}
// name等3个字段的GET SET方法
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", wealth=" + wealth +
'}';
}
}
}