您可以为每个字段使用静态 Map 作为 Comparator 并以此构建组合 Comparator:
您仍然必须使比较器为空安全并检查字段名称...
class Item {
String id;
String brand;
Integer price;
Date publishedDate;
public Item(String id, String brand, Integer price, Date publishedDate) {
super();
this.id = id;
this.brand = brand;
this.price = price;
this.publishedDate = publishedDate;
}
static Map<String, Comparator<Item>> comparatorMap = new HashMap<String, Comparator<Item>>() {
{
put("id", new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {
return o1.id.compareTo(o2.id);
}
});
put("brand", new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {
return o1.brand.compareTo(o2.brand);
}
});
put("price", new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {
return o1.price.compareTo(o2.price);
}
});
put("publishedDate", new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {
return o1.publishedDate.compareTo(o2.publishedDate);
}
});
}
};
@Override
public String toString() {
return "Item [id=" + id + ", brand=" + brand + ", price=" + price + ", publishedDate=" + publishedDate + "]";
}
static class ItemComparator implements Comparator<Item> {
private List<Comparator<Item>> comparators;
ItemComparator(String... fields) {
comparators = new ArrayList<>();
for (String field : fields) {
comparators.add(comparatorMap.get((field)));
}
}
@Override
public int compare(Item o1, Item o2) {
int result = 0;
for (Comparator comparator : comparators) {
result = comparator.compare(o1, o2);
if (result != 0) {
return result;
}
}
return result;
}
}
static List<Item> sort(List<Item> list, String... fields) {
Collections.sort(list, new ItemComparator(fields));
return list;
}
public static void main(String[] args) {
List<Item> list = new ArrayList<>();
list.add(new Item("B", "A", 5, new Date()));
list.add(new Item("A", "B", 7, new Date()));
sort(list, "id", "price");
System.out.println(list);
}
}
编辑
使用比较/然后比较的版本
使用反射获取 getter 时可以省略映射...
class Item {
String id;
String brand;
Integer price;
Date publishedDate;
public Item(String id, String brand, Integer price, Date publishedDate) {
super();
this.id = id;
this.brand = brand;
this.price = price;
this.publishedDate = publishedDate;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
public Date getPublishedDate() {
return publishedDate;
}
public void setPublishedDate(Date publishedDate) {
this.publishedDate = publishedDate;
}
static Map<String, Comparator<Item>> comparatorMap = new HashMap<String, Comparator<Item>>() {
{
put("id", Comparator.comparing(Item::getId));
put("brand", Comparator.comparing(Item::getBrand));
put("price", Comparator.comparing(Item::getPrice));
put("publishedDate", Comparator.comparing(Item::getPublishedDate));
}
};
static List<Item> sort(List<Item> list, String... fields) {
Comparator comparator = null;
for (String field : fields) {
comparator = (comparator == null) ? comparatorMap.get((field))
: comparator.thenComparing(comparatorMap.get((field)));
}
if (comparator != null) {
Collections.sort(list, comparator);
}
return list;
}
@Override
public String toString() {
return "Item [id=" + id + ", brand=" + brand + ", price=" + price + ", publishedDate=" + publishedDate + "]";
}
public static void main(String[] args) {
List<Item> list = new ArrayList<>();
list.add(new Item("B", "A", 5, new Date()));
list.add(new Item("A", "B", 7, new Date()));
sort(list, "id", "price");
System.out.println(list);
}
}