lambda表达式对list对象进行多字段排序

1、上代码

//根据年号和号码进行正序联合排序
//年号升序
Comparator<ReplyInfoVo> year = Comparator.comparing(ReplyInfoVo::getCaseNo3);

//号码升序
Comparator<ReplyInfoVo> num = Comparator.comparing(ReplyInfoVo::getCaseNo4);

// 联合排序
Comparator<ReplyInfoVo> finalComparator = year.thenComparing(num);

replyInfoVoArrayList = replyInfoVoArrayList.stream().sorted(finalComparator).collect(Collectors.toList());

//单个的排序

 caseInfoListVos = caseInfoListVos.stream().sorted(Comparator.comparing(CaseInfoListVo::getRegisterTime)reversed()).collect(Collectors.toList());

可实现先按年的字段正序排列,再按号码正序排列,亲试可行。

2、详细讲解

java代码使用lambda来排序

3、如果上面排序不正确使用下面的,亲测可行,适用所有范围

package com.iflytek.sf.zlfy;

import com.iflytek.sf.zlfy.model.vo.NoticeReplyVo;
import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.collections.comparators.ComparableComparator;
import org.apache.commons.collections4.ComparatorUtils;
import org.apache.commons.collections4.comparators.ComparatorChain;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

@SpringBootTest
class ZlfyApplicationTests {
    public static void main(String[] args) {
        List<NoticeReplyVo> replyInfoVoArrayList = new ArrayList<>();
        NoticeReplyVo noticeReplyVo = new NoticeReplyVo();
        noticeReplyVo.setReplyTimeLimit("已完成");
        noticeReplyVo.setSortReplyTime(999);
        noticeReplyVo.setCaseNo("浙政复(2022)7号");
        noticeReplyVo.setCaseNo3("2022");
        noticeReplyVo.setCaseNo4(7);
        NoticeReplyVo noticeReplyVo1 = new NoticeReplyVo();
        noticeReplyVo1.setReplyTimeLimit("还有59天到期");
        noticeReplyVo1.setSortReplyTime(59);
        noticeReplyVo1.setCaseNo("浙政复(2022)8号");
        noticeReplyVo1.setCaseNo3("2022");
        noticeReplyVo1.setCaseNo4(8);
        NoticeReplyVo noticeReplyVo2 = new NoticeReplyVo();
        noticeReplyVo2.setReplyTimeLimit("还有99天到期");
        noticeReplyVo2.setSortReplyTime(99);
        noticeReplyVo2.setCaseNo("浙政复(2022)50号");
        noticeReplyVo2.setCaseNo3("2022");
        noticeReplyVo2.setCaseNo4(50);
        NoticeReplyVo noticeReplyVo3 = new NoticeReplyVo();
        noticeReplyVo3.setReplyTimeLimit("已逾期");
        noticeReplyVo3.setSortReplyTime(-999);
        noticeReplyVo3.setCaseNo("浙政复(2022)15号");
        noticeReplyVo3.setCaseNo3("2021");
        noticeReplyVo3.setCaseNo4(15);
        replyInfoVoArrayList.add(noticeReplyVo);
        replyInfoVoArrayList.add(noticeReplyVo1);
        replyInfoVoArrayList.add(noticeReplyVo2);
        replyInfoVoArrayList.add(noticeReplyVo3);
        Comparator mycmp1 = ComparableComparator.getInstance();
        Comparator mycmp2 = ComparableComparator.getInstance();
        mycmp1 = ComparatorUtils.nullHighComparator(mycmp1);
        mycmp2 = ComparatorUtils.nullHighComparator(mycmp2);
        ArrayList<Object> sortFields = new ArrayList<Object>();
        sortFields.add(new BeanComparator("caseNo3", mycmp1)); //主排序(第一排序)
        sortFields.add(new BeanComparator("caseNo4", mycmp2)); //次排序(第二排序)
         // 创建一个排序链
        ComparatorChain multiSort = new ComparatorChain(sortFields);
        // 开始真正的排序,按照先主,后副的规则
        Collections.sort (replyInfoVoArrayList , multiSort);

//        for (NoticeReplyVo replyVo : replyInfoVoArrayList) {
//            System.out.println("排序前:" + replyVo.getReplyTimeLimit() + ":" + replyVo.getCaseNo() + ":" + replyVo.getSortReplyTime());
//        }
//        Collections.sort(replyInfoVoArrayList, new Comparator<NoticeReplyVo>() {
//            @Override
//            public int compare(NoticeReplyVo o1, NoticeReplyVo o2) {
//                int i = o1.getCaseNo3().compareTo(o2.getCaseNo3());
                int i1 = o1.getCaseNo4().compareTo(o2.getCaseNo4());
//                return i;
//            }
//        });
//        Collections.sort(replyInfoVoArrayList, new Comparator<NoticeReplyVo>() {
//            @Override
//            public int compare(NoticeReplyVo o1, NoticeReplyVo o2) {
                int i = o1.getCaseNo3().compareTo(o2.getCaseNo3());
//                int i1 = o1.getCaseNo().compareTo(o2.getCaseNo());
//                return i1;
//            }
//        });
//        Collections.sort(replyInfoVoArrayList);
//        Collections.reverse(replyInfoVoArrayList);
//        for (NoticeReplyVo replyVo : replyInfoVoArrayList) {
//            System.out.println("排序后:" + replyVo.getReplyTimeLimit() + ":" + replyVo.getCaseNo() + ":" + replyVo.getSortReplyTime());
//        }
        for (NoticeReplyVo replyVo : replyInfoVoArrayList) {
            System.out.println("排序后:" + replyVo.getCaseNo3() + ":" + replyVo.getCaseNo4());
        }
    }

    @Test
    void contextLoads() {
    }

}

在这里插入图片描述
成功,前面主排,后面次排。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bst@微胖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值