场景是不能通过数据库做排序和分页 前端传参过来 需要java端做 有啥优雅地方法没 不想一个一个判断参数
类似这样
Function<AdminUser,Comparable> fun = AdminUser::getId;
boolean sortType = true;
ArrayList<AdminUser> list = new ArrayList<>();
List<AdminUser> sortedList = list.stream().sorted((o1, o2) -> {
return sortType ? fun.apply(o1).compareTo(fun.apply(o2)) : fun.apply(o2).compareTo(fun.apply(o1));
}).collect(Collectors.toList());
内存分页不可取,数据量小孩问题不大,数据量大就抓瞎了
其实无论你是用if-else、反射、还是其他,都是逃离不了通过"要排序的字段" 找到 "对应排序的方法"这一过程,不想用if-else判断,也就下面几种方法:
下面是方法2的做法:
// 要更通用的话,自己写泛型 + 反射吧,也没什么难度
class Data {
private int id;
private String name;
// getter/setter...
}
public class Sorter {
// key = 排序字段,value = 比较方法
private Map<String, BiFunction<Data, Data, Integer>> methods;
public Sorter() {
methods = new HashMap<>();
}
public void sort(String key, List<Data> list, boolean isAsc) {
if (!methods.containsKey(key)) return;
list.sort((a, b) -> {
BiFunction<Data, Data, Integer> m = methods.get(key);
return isAsc ? m.apply(a, b) : m.apply(b, a);
});
}
public void put(String key, BiFunction<Data, Data, Integer> func) {
methods.put(key, func);
}
public static void main(String[] args) {
List<Data> list = Arrays.asList(new Data(5, "20"), new Data(15, "20"),
new Data(8, "25"), new Data(13, "22"), new Data(7, "11"));
Sorter sorter = new Sorter();
// 这里就随便用了2个排序方法,看看就行
sorter.put("id", (a, b) -> a.getId() - b.getId());
sorter.put("name", (a, b) -> a.getName().compareTo(b.getName()));
sorter.sort("id", list, true);
System.out.println(list);
sorter.sort("name", list, false);
System.out.println(list);
}
}