在对list排序的时候可能会碰到两个数据维度的自定义排序
比如一组学生数据,有考试状态,要按照考试状态为未考试(考试状态 0 未考试 1 已通过 2 未通过)的排在前面,其他的状态按照考试时间降序排列。
实体类
@Data
@AllArgsConstructor
public class Student {
private Integer id;
private String name;
/**
* 考试状态 0 未考试 1 已通过 2 未通过
*/
private Integer status;
/**
* 考试时间
*/
@JSONField(format = "YYYY-mm-dd HH:mm:ss")
private LocalDateTime timeOfTest;
}
排序代码
public static void main(String[] args) {
List<Student> list = new ArrayList<Student>();
list.add(new Student(2, "Sherry", 1, LocalDateTime.parse("2022-05-19T12:34:56")));
list.add(new Student(3, "Tom", 0,LocalDateTime.parse("2022-05-19T11:55:56")));
list.add(new Student(1, "Tom", 2, LocalDateTime.parse("2022-05-19T15:34:56")));
list.add(new Student(5, "Lily", 1, LocalDateTime.parse("2022-05-19T16:11:56")));
list.add(new Student(4, "Alisa", 1,LocalDateTime.parse("2022-05-19T22:00:56")));
List<Student> students=list.stream().sorted((p1,p2) ->{
//如果状态等于0(未考试),按照考试状态升序排
if (p1.getStatus().equals(0) || p2.getStatus().equals(0)){
return p1.getStatus()-p2.getStatus();
}else {
return p2.getTimeOfTest().compareTo(p1.getTimeOfTest());
}
}).collect(Collectors.toList());
System.out.println(JSON.toJSONString(students));
}
输出结果
[
{
"id":3,
"name":"Tom",
"status":0,
"timeOfTest":"2022-05-19T11:55:56"
},
{
"id":4,
"name":"Alisa",
"status":1,
"timeOfTest":"2022-05-19T22:00:56"
},
{
"id":5,
"name":"Lily",
"status":1,
"timeOfTest":"2022-05-19T16:11:56"
},
{
"id":1,
"name":"Tom",
"status":2,
"timeOfTest":"2022-05-19T15:34:56"
},
{
"id":2,
"name":"Sherry",
"status":1,
"timeOfTest":"2022-05-19T12:34:56"
}
]