集合的排序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;}@Overridepublic 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);// 正序 写法1list.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);}

JDK1.8优雅的集合排序(集合的排序)相关推荐

  1. TreeSet集合(自然排序和比较器排序)

    TreeSet集合 自然排序和比较器排序 ​ 当指执行插入排序.希尔排序.归并排序等算法时,比较两个对象"大小"的比较操作.我们很容易理解整型的 i>j 这样的比较方式,但当 ...

  2. sont表示元素在存入集合时进行了排序,数据遍历的结果是按某个排序规则输出的

    单选 sont表示元素在存入集合时进行了排序,数据遍历的结果是按某个排序规则输出的;而order表示每次遍历的序列都是一样的,元素前后关系每次遍历都是确定的,那么下列哪些集合既是sort,又是orde ...

  3. java arraylist comparable_Java 两种ArrayList集合自定义对象属性排序,Comparator接口 或 Comparable接口...

    1,Comparator接口 -- 重写Comparator public class User { private String id; private String name; public Us ...

  4. redis 的使用 (sort set排序集合类型操作)

    sort set排序集合类型 释义: sort set 是 string 类型的集合 sort set 的每个元素 都会关联一个 权 通过 权值 可以有序的获取集合中的元素 应用场合: 获取热门帖子( ...

  5. 集合到文件数据排序改进版

    案例需求 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩).要求按照成绩总分从高到低写入文本文件 格式:姓名,语文成绩,数学成绩,英语成绩 举例:林青霞,98,99,100 分析步骤 定义学 ...

  6. java学习(121):treeset排序集合

    //treeset排序集合 import java.util.*;public class test61{public static void main(String[] args){TreeSet ...

  7. 请拆招:将两个已排序集合分解成两个独立部分的集合和一个共有部分的集合?...

    请拆招:将两个已排序集合分解成两个独立部分的集合和一个共有部分的集合? 请看下面的代码. using System; using System.Collections.Generic; namespa ...

  8. 按照姓名升序排序的代码_好程序员Java培训分享Java集合的两种排序方法

    好程序员Java培训分享Java集合的两种排序方法,Java集合的工具类Collections中提供了两种排序的方法,分别是: 1.Collections.sort(List list) 2.Coll ...

  9. 前后端分别实现集合根据中文拼音排序

    java实现集合根据中文拼音排序 public static void main(String[] args){Comparator<Object> com = Collator.getI ...

  10. 集合--Set集合--HashSet类、LinkedHashSet类、TreeSet类及其自然排序

    Set集合 HashSet类 import java.util.HashSet;/*Set集合:元素唯一且元素无序(存储和取出顺序不一致)的集合HashSet类概述不保证 set 的迭代顺序特别是它不 ...

最新文章

  1. Push to origin/master was rejected解决方法
  2. MySQL 性能 细节 考量 (更新中......)
  3. 递归神经网络部分组件(七)
  4. 机器人庄园作文_十年后的家乡作文精选8篇
  5. App iPhone版内部测试使用办法
  6. jquery ajax post 传递数组 ,多checkbox 取值
  7. Java面试之谈谈对CAS的理解
  8. Swift 提示 error running playground...
  9. CDN 原理和几种变形(DCDN/ECDN/PCDN/SCDN)
  10. 微信获取unionid
  11. 安装Python第三方库的基本方法
  12. Java8日期时间API
  13. 计算机分盘介质受写入保护,在win7中,U盘新建文件提示“介质受写入保护”怎么回事?...
  14. 开源电子书项目FBReader初探(四)
  15. 北京科技计算机类好不好,北京信息科技大学怎么样 在全国排名多少好不好
  16. Python项目:外星人入侵(汇总)
  17. GITC--2014全球互联网技术大会正式开始售票
  18. CodeForces - 985E Pencils and Boxes
  19. C++字符串类std::string介绍
  20. FPGA异步信号寄存器打拍

热门文章

  1. Intellij IDEA破解码
  2. WIFI 2.4G及5G信道一览表
  3. 三星note升级android9,三星Note9官方台版安卓9固件rom升级更新包:BRI-N960FXXS3CSI5
  4. Django REST Framework——3. 序列化器(Serializer)
  5. 智慧停车系统源码-后台全开源的商业级智慧停车系统源码-YunParking
  6. HTTP长连接---requests的长连接
  7. js定义对象时属性名是否加引号问题
  8. java无法定位程序点_无法定位程序输入点是什么意思
  9. 数据库设计-简化字典表
  10. Python3 使用psycopg2模块 批量写入数据到PostgreSQL数据库(最强输出速度,单机数据库3000W数据写入最多180秒)