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);
    }

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JDK 1.8是Java开发工具包(Java Development Kit)的一个版本,是Java编程语言的重要工具之一。它包含了编译器、运行时环境、调试器和其他一些用于开发Java应用程序的工具。 JDK 1.8中引入了许多新特性和改进,其中最重要的是Lambda表达式和函数式接口。Lambda表达式是一种简化匿名内部类的方式,它使得编写代码更简洁、易读。函数式接口则是一种只有一个抽象方法的接口,它能够被Lambda表达式直接实现,提供了更强大的代码组织和处理能力。 除了Lambda表达式和函数式接口,JDK 1.8还引入了一些其他的新特性,如Streams API(流式API)、日期时间API、默认方法(default methods)等。Streams API提供了一种新的集合处理方式,使得对集合中的元素进行过滤、映射、排序等操作更加便捷。日期时间API则提供了对日期和时间的更加灵活和易用的操作方法。默认方法允许在接口中定义具体的实现,为现有的接口添加新的方法时更加方便。 JDK 1.8在性能方面也进行了优化,包括对编译器、垃圾回收器、类加载器等进行了改进和优化,提升了Java应用程序的性能和效率。 总之,JDK 1.8是一次重要的版本升级,引入了许多新特性和改进,使得Java编程更加灵活、高效和易用。这些特性使得Java开发人员能够更轻松地编写出高质量、可维护的代码,提升了开发效率和用户体验。 ### 回答2: JDK1.8是Java Development Kit(Java开发工具包)的一种版本,csdn是一家广受欢迎的中文技术社区和博客平台。 JDK1.8是Java平台的一个重要更新版本。它包含了许多新的特性和改进,为Java开发人员提供了更好的开发体验和更强大的功能。JDK1.8引入了Lambda表达式、函数式接口、Stream API等重要的语言特性和功能,使得Java语言更加现代化和灵活。 Lambda表达式是JDK1.8引入的一个重要特性,它简化了在函数式编程中使用的匿名内部类的写法,使得代码更加简洁易读。Lambda表达式的引入大大增加了Java语言的表达力,使得开发人员可以更方便地编写函数式风格的代码。 函数式接口是另一个JDK1.8的重要特性,它是只包含一个抽象方法的接口。函数式接口可以用lambda表达式或方法引用来实现,使得开发人员可以更方便地使用函数式编程的思想来解决问题。 Stream API是JDK1.8新增的另一个重要特性,它提供了一种更高效、更简洁的方式来处理集合数据。Stream API利用了函数式编程的特性,可以方便地进行数据过滤、转换、聚合等操作,大大简化了对集合数据的处理代码。 csdn是一个面向中国IT技术人员的社区平台,提供了丰富的技术文章、博客、论坛等资源。在csdn上,开发者可以分享自己的技术经验和思考,学习他人的经验,解决问题。通过csdn,开发者可以与同行交流,不断提升自己的技术水平。 综上所述,JDK1.8是Java开发工具包的一个版本,引入了许多重要的新特性和改进,使得Java开发更加现代化和灵活。而csdn则是为中国IT技术人员提供了一个学习和交流的平台,使得开发者可以更好地掌握和应用JDK1.8的特性。 ### 回答3: JDK 1.8是Java Development Kit的缩写,是Java开发平台的一个重要版本。CSND是一个国内知名的技术社区,是中国最大的IT社区之一。JDK 1.8和CSND有什么关系呢? 首先,JDK 1.8是Java的一个重要版本,它包含了许多新的特性和功能,使得开发者能够更加方便地编写高效的Java代码。例如,它引入了Lambda表达式和函数式接口,使得代码更加简洁和易于理解。另外,JDK 1.8还引入了Stream API,提供了一种更强大和易于使用的方法来处理集合数据。这些新特性和功能对于Java开发者来说非常重要,因为它们可以提高开发效率和代码质量。 而CSND作为一个知名的技术社区,提供了一个平台,供开发者学习和分享技术知识。在CSND上,你可以找到大量关于JDK 1.8的文章、教程和讨论。这些内容可以帮助开发者更好地理解和应用JDK 1.8的新特性和功能。此外,CSND也提供了一个交流平台,开发者可以在这里互相交流经验、解决问题并相互学习。在CSND上,你可以找到许多与JDK 1.8相关的问答、指导和分享,帮助你更深入地学习和应用JDK 1.8。 总结而言,JDK 1.8是Java开发平台的一个重要版本,它包含了许多新特性和功能。而CSND作为一个知名的技术社区,提供了丰富的资源和交流平台,使得开发者可以更好地学习和应用JDK 1.8。通过在CSND上查阅和参与讨论,开发者可以深入了解JDK 1.8的特性,并应用于实际开发中,提高自己的技术水平。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值