1. 自定义类
public static class Person {
private String name;
private Integer age;
private Integer level;
public Person() {
}
public Person(String name, Integer age, Integer level) {
this.name = name;
this.age = age;
this.level = level;
}
// 此处省略 get、set
}
2. 单个字段排序
降序 reversed()
(默认是升序)
直接排序如果排序字段为null的话会出现NullPointerException所以需要排空
解决方式:
- 过滤掉该字段为null的数据
- 使用nullsFirst()或者/nullsLast()
public class TestMain {
public static void main(String[] args) {
Person xm = new Person("小明", 18, 1);
Person xh = new Person("小红", 22, 2);
Person xb = new Person("小白", 18, 2);
Person xl = new Person("小蓝", 22, 1);
List<Person> list = Arrays.asList(xm, xh, xb, xl);
// 以年龄降序 reversed() (默认是升序)
List<Person> collect = list.stream()
.sorted(Comparator.comparing(Person::getAge, Comparator.nullsFirst(Integer::compareTo)).reversed())
.collect(Collectors.toList());
for (Person person : collect) {
System.out.println(JSONObject.toJSONString(person));
}
/* 结果
{"age":22,"level":2,"name":"小红"}
{"age":22,"level":1,"name":"小蓝"}
{"age":18,"level":1,"name":"小明"}
{"age":18,"level":2,"name":"小白"}
*/
}
}
3. 多个字段排序
先以年龄 age
进行降序, 如果年龄相同则以层级 level
进行降序。
这里要注意,主排序字段要放到最后,次排序字段要放在前面
比如这里 level
字段要放前面, age
字段要放后面
// 多个字段进行降序, 先以年龄进行降序, 如果年龄相同则以层级进行降序
List<Person> collect = list.stream()
.sorted(Comparator.comparing(Person::getLevel).reversed())
.sorted(Comparator.comparing(Person::getAge).reversed())
.collect(Collectors.toList());
/* 结果
{"age":22,"level":2,"name":"小红"}
{"age":22,"level":1,"name":"小蓝"}
{"age":18,"level":2,"name":"小白"}
{"age":18,"level":1,"name":"小明"}
*/