需求:从数据库中查询到实体类的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());