Lambda表达式自定义排序,升序再降序

这篇博客介绍了如何使用Java对包含考试状态和时间的学生数据进行自定义排序。首先,根据考试状态(0表示未考试,1表示已通过,2表示未通过)将未考试的学生排在前面,然后按照考试时间降序排列其他状态的学生。示例代码展示了如何利用Java 8的Stream API实现这一排序逻辑,并给出了排序后的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在对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"
    }
]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值