Java8 stream 多条件排序,且支持自定义排序

需求:从数据库中查询到实体类的list,需要根据实体类中的某几个字段进行排序。

假设:实体类如下

static class SortExample{
        private Integer id;
        private String region;
        private String fileType;
        private String fileCode;
        private String fileSize;

        public Integer getId() {
            return id;
        }

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

        public String getRegion() {
            return region;
        }

        public void setRegion(String region) {
            this.region = region;
        }

        public String getFileType() {
            return fileType;
        }

        public void setFileType(String fileType) {
            this.fileType = fileType;
        }

        public String getFileCode() {
            return fileCode;
        }

        public void setFileCode(String fileCode) {
            this.fileCode = fileCode;
        }

        public String getFileSize() {
            return fileSize;
        }

        public void setFileSize(String fileSize) {
            this.fileSize = fileSize;
        }
    }

实体类列表如下:

[
            {
                "id": "1",
                "region": "beijing",
                "fileType": "txt",
                "fileCode": "AOSR",
                "fileSize": "124587"
            
            },
            {
               "id": "2",
                "region": "shanghai",
                "fileType": "md",
                "fileCode": "AOSM",
                "fileSize": "145"
            },
            {
                "id": "3",
                "region": "beijing",
                "fileType": "xlsx",
                "fileCode": "AOSD",
                "fileSize": "245"
            },
            {
                "id": "4",
                "region": "shanghai",
                "fileType": "txt",
                "fileCode": "AOSM",
                "fileSize": "4512"
            },
            {
                "id": "5",
                "region": "shanghai",
                "fileType": "rar",
                "fileCode": "AOSR",
                "fileSize": "67865"
            },
            {
                "id": "6",
                "region": "beijing",
                "fileType": "xlsx",
                "fileCode": "AOSD",
                "fileSize": "2312"
            }
        ]

现在我需要对列表中的三个字段进行排序,首先排地区(region)、然后排文件代码(fileCode)、最后排文件类型(fileType)。

排完序之后,这个就需要首先观察region排序情况,是否符合排序条件。符合的话,再观察同一个region下,fileCode是否符合排序条件,当fileCode符合排序条件的时候,再去看fileType是否符合排序条件。当所有的都符合排序条件的时候,排序完成。

这种需要多个字段排序的情况,非常适合使用java8的次级排序

代码如下:

List<SortExample> collect2 = sortExampleList.stream().sorted(Comparator.comparing(SortExample::getRegion)
                .thenComparing(SortExample::getFileCode).thenComparing(SortExample::getFileType)).collect(Collectors.toList());

排序之后的代码如下:经观察,排序是符合情况的。且都是都是按照字符升序的。

[
  {
    "fileCode": "AOSD",
    "fileSize": "245",
    "fileType": "xlsx",
    "id": 3,
    "region": "beijing"
  },
  {
    "fileCode": "AOSD",
    "fileSize": "2312",
    "fileType": "xlsx",
    "id": 6,
    "region": "beijing"
  },
  {
    "fileCode": "AOSR",
    "fileSize": "124587",
    "fileType": "txt",
    "id": 1,
    "region": "beijing"
  },
  {
    "fileCode": "AOSM",
    "fileSize": "145",
    "fileType": "md",
    "id": 2,
    "region": "shanghai"
  },
  {
    "fileCode": "AOSM",
    "fileSize": "4512",
    "fileType": "txt",
    "id": 4,
    "region": "shanghai"
  },
  {
    "fileCode": "AOSR",
    "fileSize": "67865",
    "fileType": "rar",
    "id": 5,
    "region": "shanghai"
  }
]

1)假设其中一个字段需要逆序

List<SortExample> collect1 = sortExampleList.stream().sorted(Comparator.comparing(SortExample::getRegion)
                .thenComparing(SortExample::getFileCode, Comparator.reverseOrder()).thenComparing(SortExample::getFileType)).collect(Collectors.toList());

可以使用Comparator.reverseOrder()对某一个字段进行逆序排序。如下图就是对fileCode单独进行排序

2)假设fileCode字段不按照升序或者逆序排序,而是按照一个自定义的顺序排序。

fileCode目前只有三种类型。如果升序的话就是AOSD,AOSM,AOSR。逆序的话就是AOSR,AOSM,AOSD。但是我像它按照AOSR,AOSD,AOSM这种自定义的顺序进行排序。

代码如下:


// 先新建一个排序list
List<String> sortList = Arrays.asList("AOSR", "AOSD", "AOSM");

// 使用Comparator.comparing(sortList::indexOf) 参数进行自定义排序
List<SortExample> collect1 = sortExampleList.stream().sorted(Comparator.comparing(SortExample::getRegion).thenComparing(SortExample::getFileCode, Comparator.comparing(sortList::indexOf)).thenComparing(SortExample::getFileType)).collect(Collectors.toList());

 

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值