方案一:使用thenComparing
areaList.stream()
.sorted(Comparator.comparing(Area::getSortNo)
.thenComparing(Area::getName, (x, y) -> {
Collator clt = Collator.getInstance(Locale.CHINA);
return clt.compare(x, y);
})
.thenComparing(Area::getCreatedDate))
.map(area -> {
JSONObject areaJson = new JSONObject();
areaJson.put("areaId", area.getId());
areaJson.put("areaParentId", areaId);
areaJson.put("areaName", area.getName());
areaJson.put("hasChildren", areaService.count(QArea.area.parent.id.eq(area.getId())) > 0);
return areaJson;
})
.collect(Collectors.toList());
方案二:按某个字段排好序后,再按另一个字段排序;
// 按空间、层级、更新时间排序
List<JSONObject> folderResultList = new ArrayList<>();
// 按空间排序
Map<String, List<JSONObject>> folderMap = fileFolderList.stream().sorted(Comparator.comparing(folderJson -> {
String jsonDiskType = folderJson.getString("diskType");
return orderDiskTypeList.indexOf(jsonDiskType);
}, Comparator.nullsLast(Integer::compareTo)))
.collect(Collectors.groupingBy(folderJsonG -> folderJsonG.getString("diskType"), LinkedHashMap::new, Collectors.toList()));
folderMap.entrySet().forEach(mapEntry -> {
List<JSONObject> subList = mapEntry.getValue();
// 按层级排序
Map<Integer, List<JSONObject>> subMap = subList.stream().sorted(Comparator.comparing(folderJson -> {
if (StringUtils.isNotBlank(folderJson.getString("folderIdPath"))) {
return folderJson.getString("folderIdPath").split(",").length;
} else {
return 0;
}
}, Comparator.nullsLast(Integer::compareTo)))
.collect(Collectors.groupingBy(folderJsonSub -> folderJsonSub.getString("folderIdPath") == null ? 0 : folderJsonSub.getString("folderIdPath").split(",").length, LinkedHashMap::new, Collectors.toList()));
subMap.entrySet().forEach(subEntry -> {
List<JSONObject> diskTypeLevelList = subEntry.getValue();
// 按最后更新时间排序
List<JSONObject> resultList = diskTypeLevelList.stream().sorted(Comparator.comparing(folderJson -> folderJson.getDate("lastModifiedDate"), Comparator.nullsLast(Date::compareTo)))
.collect(Collectors.toList());
folderResultList.addAll(resultList);
});
});