我现在想对一个list写一个排序方法 参数是字段名 和排序类型(正序 倒叙)

我现在想对一个list写一个排序方法 参数是字段名 和排序类型(正序 倒叙) 返回排序过后的list

场景是不能通过数据库做排序和分页 前端传参过来 需要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判断,也就下面几种方法:

  1. 反射的思路:通过前端传过来的排序字段,反射获取对应的排序方法,然后调用。
  2. 用map做方法映射:把要排序的字段,与排序方法事先先存进一个map中,然后直接取出来用即可
  3. 还有很多其他类似的方法,就不赘述了。

下面是方法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);
    }
}