JDK1.8优雅的集合排序(集合的排序)

       集合的排序order,就是按照某个固定的规则进行排序,可能只是按照某个字段进行排序,也可能按照某几个字段进行排序已达到某种业务需求

       比如我以前做过一个需求,一个分页列表数据的展示
       但是这些数据的需要调用三个不同的接口进行查询,然后拼接在一起,展示。因为数据源来源于多个接口(也就是多个库),所以处理的方式:分别调用这个三个接口,把这三个接口返回的数据转化成同一个对象,然后这些集合对象进行拼接,再按照排序规则进行排序并对最终的集合进行截取,获取当前页的数据集即可。
备注:如果调用的接口响应很慢,但是接口无法提效(比如接口是来源于第三方),可以采用这个三个接口同时去请求(并行去处理),假如每个接口的响应时间是1.2s,串行的响应时间就是1.2+1.2+1.2=3.6s,并行去处理的话,获取这三个接口的响应时间仍旧是1.2s。

      本博客主要讲了简单对象的排序和复杂对象的排序。
      简单对象的排序比如Integer、String、BigDecimal等,本文以Integer为例。
      复杂对象的排序比如我们自定义的dto

     1、环境准备工作
     编码工具(idea) + JDK1.8

     2、代码

     2.1、创建DTO

/**
 * Date: 2020/10/22
 * Time: 下午19:25
 *
 * @author 深思熟虑
 */

public class StudentDTO {

    /**
     * 主键
     */
    private Integer id;

    /**
     * 姓名
     */
    private String name;


    /**
     * 英语分数
     */
    private BigDecimal englishScore;

    /**
     * 数学分数
     */
    private BigDecimal mathScore;

    /**
     * 语文成绩
     */
    private BigDecimal chinaScore;

    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public BigDecimal getEnglishScore() {
        return englishScore;
    }

    public BigDecimal getMathScore() {
        return mathScore;
    }

    public BigDecimal getChinaScore() {
        return chinaScore;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setEnglishScore(BigDecimal englishScore) {
        this.englishScore = englishScore;
    }

    public void setMathScore(BigDecimal mathScore) {
        this.mathScore = mathScore;
    }

    public void setChinaScore(BigDecimal chinaScore) {
        this.chinaScore = chinaScore;
    }

    @Override
    public String toString() {
        return "StudentDTO{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", englishScore=" + englishScore +
                ", mathScore=" + mathScore +
                ", chinaScore=" + chinaScore +
                '}';
    }

2.2、排序:

/**
 * Date: 2020/10/22
 * Time: 下午11:23
 *
 * @author 深思熟虑
 */
public class SortDemo {

    public static void main(String[] args) {

        /**
         * 以Integer为demo,进行排序
         * 排序的list中,如果有的元素为null,则会报错NPE(空指针)
         */
        sortInteger();

        /**
         * 以Integer为demo,进行排序
         * list中元素为null的排序code如下
         * 注:null排在最前后者最后面两种方式
         */
        sortIntegerWithNUll();

        /**
         * 复杂对象的排序,为null会报空指针异常
         * 集合中含有null的问题可以参考 sortIntegerWithNUll方法,省略
         */
        sortObj();

        /**
         * 复杂排序:多条件排序
         * 场景:先按照语文成绩排序,如果语文成绩一样,再按照数学成绩排序
         */
        complexSort();

        /**
         * 自定义排序
         */
        customizeSort();

    }

    /**
     * 基本类型的排序
     * 对于integer的排序 写法1, Comparator.comparing 与Comparator.comparingInt,两者可以互相代替
     * 对于integer的排序 写法1,Comparator.comparing 与Comparator.comparingInt,两者不可以互相代替
     */
    private static void sortInteger() {
        /**
         * Integer 排序
         */
        List<Integer> list = new ArrayList<>();
        list.add(10);
        list.add(9);
        list.add(15);
        list.add(5);
        list.add(3);
        // 正序 写法1
        list.sort(Comparator.comparing(Integer::intValue));
        System.out.println("=======正序 写法 1======");
        list.forEach(System.out::println);

        // 正序 写法2(naturalOrder 自然排序就是正序)
        // Comparator.comparing 与Comparator.comparingInt,两者可以互相代替
        list.sort(Comparator.comparing(Integer::intValue, Comparator.naturalOrder()));
        System.out.println("=======正序 写法 2======");
        list.forEach(System.out::println);

        // 倒序  reverseOrder倒序
        // Comparator.comparing 与Comparator.comparingInt,两者不可以互相代替
        list.sort(Comparator.comparing(Integer::intValue, Comparator.reverseOrder()));
        System.out.println("=======倒序======");
        list.forEach(System.out::println);


    }

    private static void sortIntegerWithNUll() {
        /**
         * Integer 排序
         */
        List<Integer> list = new ArrayList<>();
        list.add(10);
        list.add(null);
        list.add(9);
        list.add(15);
        list.add(null);
        list.add(5);
        list.add(3);

        System.out.println("=======集合中有null,原始数据======");
        list.forEach(System.out::println);

        // null 排最前面 正序
        list.sort(Comparator.nullsFirst(Comparator.comparing(Integer::intValue)));
        System.out.println("=======null 排最前面 正序======");
        list.forEach(System.out::println);

        list.sort(Comparator.nullsFirst(Comparator.comparing(Integer::intValue, Comparator.naturalOrder())));
        list.sort(Comparator.nullsFirst(Comparator.comparingInt(Integer::intValue)));

        // null 排最后面 正序
        list.sort(Comparator.nullsLast(Comparator.comparing(Integer::intValue)));
        System.out.println("=======null 排最后面 正序======");
        list.forEach(System.out::println);

        list.sort(Comparator.nullsLast(Comparator.comparing(Integer::intValue, Comparator.naturalOrder())));
        list.sort(Comparator.nullsLast(Comparator.comparingInt(Integer::intValue)));

        // 倒序省略 。。。。

    }

    private static void sortObj() {
        List<StudentDTO> students = new ArrayList<>();

        System.out.println("==================按照学生的英语传成绩原始数据=========================");
        // 测试数据
        for (int i=0; i < 5; i++) {
            StudentDTO studentDTO = new StudentDTO();
            studentDTO.setId(i);
            studentDTO.setName("张三" + 1);
            studentDTO.setChinaScore(BigDecimal.valueOf(Math.random()).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP));
            studentDTO.setEnglishScore(BigDecimal.valueOf(Math.random()).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP));
            studentDTO.setMathScore(BigDecimal.valueOf(Math.random()).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP));
            students.add(studentDTO);
            System.out.println(studentDTO);
        }

        /**
         * 按照学生的英语传成绩进行正序排序
         * 不加这个参数Comparator.naturalOrder()默认是正序
         */
        students.sort(Comparator.comparing(StudentDTO::getEnglishScore, Comparator.naturalOrder()));

        System.out.println("==================按照学生的英语传成绩进行正序排序=========================");

        students.forEach(System.out::println);

        /**
         * 按照学生的英语传成绩进行倒序排序
         */
        students.sort(Comparator.comparing(StudentDTO::getEnglishScore, Comparator.reverseOrder()));

        System.out.println("==================按照学生的英语传成绩进行倒序排序=========================");

        students.forEach(System.out::println);

    }

    private static void complexSort() {
        System.out.println("==========多条件排序=============");
        List<StudentDTO> students = new ArrayList<>();

        StudentDTO studentDTO1 = new StudentDTO();
        studentDTO1.setId(1);
        studentDTO1.setName("小明");
        studentDTO1.setMathScore(BigDecimal.valueOf(90));
        studentDTO1.setChinaScore(BigDecimal.valueOf(87.5));
        studentDTO1.setEnglishScore(BigDecimal.valueOf(84));
        students.add(studentDTO1);

        StudentDTO studentDTO2 = new StudentDTO();
        studentDTO2.setId(1);
        studentDTO2.setName("小花");
        studentDTO2.setMathScore(BigDecimal.valueOf(90));
        studentDTO2.setChinaScore(BigDecimal.valueOf(97));
        studentDTO2.setEnglishScore(BigDecimal.valueOf(88));
        students.add(studentDTO2);

        StudentDTO studentDTO3 = new StudentDTO();
        studentDTO3.setId(1);
        studentDTO3.setName("小刘");
        studentDTO3.setMathScore(BigDecimal.valueOf(93));
        studentDTO3.setChinaScore(BigDecimal.valueOf(87.5));
        studentDTO3.setEnglishScore(BigDecimal.valueOf(88));
        students.add(studentDTO3);

        System.out.println("==========多条件排序:原数据=============");
        students.forEach(System.out::println);

        System.out.println("==========多条件排序:排序之后数据=============");
        System.out.println("==========按照语文成绩排名,语文成绩一样,再按照数学成绩排名=============");
        students.sort(Comparator.comparing(StudentDTO::getChinaScore, Comparator.reverseOrder())
                .thenComparing(StudentDTO::getMathScore, Comparator.reverseOrder()));
        students.forEach(System.out::println);
    }

    /**
     * 自定义排序
     * 比如 学生按照 语文成绩进行排名,如果一样的话,再按照数学成绩排名
     * 比如 学生 按照总的成绩进行排序,如果总的成绩一样,按照语文成绩排序
     * 以上两种场景的排序,都是比较复杂的排序,需要自定义排序
     */
    private static void customizeSort() {
        System.out.println("==========多条件排序=============");
        List<StudentDTO> students = new ArrayList<>();

        StudentDTO studentDTO1 = new StudentDTO();
        studentDTO1.setId(1);
        studentDTO1.setName("小明");
        studentDTO1.setMathScore(BigDecimal.valueOf(90));
        studentDTO1.setChinaScore(BigDecimal.valueOf(87.5));
        studentDTO1.setEnglishScore(BigDecimal.valueOf(84));
        students.add(studentDTO1);

        StudentDTO studentDTO2 = new StudentDTO();
        studentDTO2.setId(1);
        studentDTO2.setName("小花");
        studentDTO2.setMathScore(BigDecimal.valueOf(90));
        studentDTO2.setChinaScore(BigDecimal.valueOf(97));
        studentDTO2.setEnglishScore(BigDecimal.valueOf(88));
        students.add(studentDTO2);

        StudentDTO studentDTO3 = new StudentDTO();
        studentDTO3.setId(1);
        studentDTO3.setName("小刘");
        studentDTO3.setMathScore(BigDecimal.valueOf(93));
        studentDTO3.setChinaScore(BigDecimal.valueOf(87.5));
        studentDTO3.setEnglishScore(BigDecimal.valueOf(88));
        students.add(studentDTO3);

        System.out.println("==========多条件排序:原数据=============");
        students.forEach(System.out::println);
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值