可以实现比较器的映射/列表/枚举,然后可以选择单个比较器,例如使用字符串名称:
static Map<String, Comparator<CustomObject>> comparators = Map.of(
"id", Comparator.comparingInt(CustomObject::getId),
"id desc", Comparator.<CustomObject>comparingInt(CustomObject::getId).reversed(),
"name", Comparator.comparing(CustomObject::getName),
"name desc", Comparator.comparing(CustomObject::getName, Comparator.reverseOrder()),
"city", Comparator.comparing(CustomObject::getCity),
"city desc", Comparator.comparing(CustomObject::getCity, Comparator.reverseOrder()),
"zip", Comparator.comparingInt(CustomObject::getZipCode),
"zip desc", Comparator.<CustomObject>comparingInt(CustomObject::getZipCode).reversed()
);
然后通过别名获取适当的比较器:
List<CustomObject> data = Arrays.asList(
new CustomObject(1, "Jack", "London", 23456),
new CustomObject(9, "Buck", "Boston", 45678),
new CustomObject(5, "Kyle", "Jersey", 19876),
new CustomObject(7, "Stan", "Ashton", 36901)
);
System.out.println("raw list: " + data);
data.sort(comparators.get("id desc"));
System.out.println("id desc: " + data);
data.sort(comparators.get("name desc"));
System.out.println("name desc: " + data);
data.sort(comparators.get("zip"));
System.out.println("zip code: " + data);
输出:
raw list: [{id=1, name=Jack, city=London, zip=23456}, {id=9, name=Buck, city=Boston, zip=45678}, {id=5, name=Kyle, city=Jersey, zip=19876}, {id=7, name=Stan, city=Ashton, zip=36901}]
id desc: [{id=9, name=Buck, city=Boston, zip=45678}, {id=7, name=Stan, city=Ashton, zip=36901}, {id=5, name=Kyle, city=Jersey, zip=19876}, {id=1, name=Jack, city=London, zip=23456}]
name desc: [{id=7, name=Stan, city=Ashton, zip=36901}, {id=5, name=Kyle, city=Jersey, zip=19876}, {id=1, name=Jack, city=London, zip=23456}, {id=9, name=Buck, city=Boston, zip=45678}]
zip code: [{id=5, name=Kyle, city=Jersey, zip=19876}, {id=1, name=Jack, city=London, zip=23456}, {id=7, name=Stan, city=Ashton, zip=36901}, {id=9, name=Buck, city=Boston, zip=45678}]