需求场景
从数据库查出来一堆数据,需要你进行分页以及按里面一些参数进行排序,恰好你不熟悉sql(或者懒得改动sql),你可以简单使用下面这个工具类进行分页与排序
实现方法
这段代码定义了一个泛型方法 getListPage
,用于对一个 List
进行分页和排序。代码的大致功能如下:
- 获取总记录数:通过
list.size()
获取列表的总记录数count
。 - 空列表检查:如果
count
为 0,直接返回原列表。 - 反射获取排序方法:通过反射机制,获取要排序的字段的 getter 方法。
- 排序:
- 根据字段类型(
String
、Integer
、Date
)分别进行排序。 - 字符串使用
Collator
进行比较。 - 整数进行减法比较,并根据
order
(排序顺序)决定返回值。 - 日期类型直接调用
compareTo
进行比较。
- 根据字段类型(
- 分页:
- 计算总页数
pages
。 - 根据
pageNum
和pageSize
计算起始位置start
和终止位置end
。 - 返回从
start
到end
的子列表。
- 计算总页数
下面是对该代码的详细分析和一些建议:
代码细节分析
-
排序条件获取:
final Method method = list.get(0).getClass().getMethod("get" + capitalize(condition)); - 这里通过反射机制获取排序字段的 getter 方法,
capitalize(condition)
是一个假设存在的方法,用于将字段名首字母大写。
- 这里通过反射机制获取排序字段的 getter 方法,
-
排序实现:
list.sort((o1, o2) -> { //... }); - 使用
List
的sort
方法,并传入自定义的比较器。 - 比较器中,根据字段类型进行不同的比较逻辑。
- 使用
-
分页计算:
int pages = count % pageSize == 0 ? count / pageSize : count / pageSize + 1; int start = pageNum <= 0 ? 0 : (pageNum > pages ? (pages - 1) * pageSize : (pageNum - 1) * pageSize); int end = pageNum <= 0 ? (pageSize <= count ? pageSize : count) : (pageSize * pageNum <= count ? pageSize * pageNum : count); return list.subList(start, end); - 计算总页数
pages
。 - 根据
pageNum
和pageSize
计算起始和结束位置,并返回子列表。
- 计算总页数
完整代码
public static <T> List<T> getListPage(List<T> list, String condition, int order, int pageNum, int pageSize) { int count = list.size(); // 总记录数 if (count == 0) { return list; } try { final Method method = list.get(0).getClass().getMethod("get" + capitalize(condition)); Collator collator = Collator.getInstance(Locale.CHINA); list.sort((o1, o2) -> { try { Object value1 = method.invoke(o1); Object value2 = method.invoke(o2); if (value1 instanceof String && value2 instanceof String) { System.out.println("string类型排序"); if (order > 0) { return collator.compare(value1, value2); } else { return collator.compare(value2, value1); } } else if (value1 instanceof Integer && value2 instanceof Integer) { System.out.println("int类型排序"); int temp = (Integer.parseInt(String.valueOf(value1)) - Integer.parseInt(String.valueOf(value2))); if (order > 0) { //正序,从小到大 if (temp > 0) { return order; } else { return -order; } } else { //倒序,从大到小 if (temp > 0) { return order; } else { return -order; } } } else if (value1 instanceof Date && value2 instanceof Date) { if(order > 0) { return ((Date) value1).compareTo((Date) value2); }else { return ((Date) value2).compareTo((Date) value1); } }else { throw new Exception("无效的排序条件"); } } catch (Exception e) { throw new RuntimeException(e); } }); } catch (NoSuchMethodException e) { throw new RuntimeException("无效的排序条件" + condition, e); } // 计算总页数 int pages = count % pageSize == 0 ? count / pageSize : count / pageSize + 1; // 起始位置 int start = pageNum <= 0 ? 0 : (pageNum > pages ? (pages - 1) * pageSize : (pageNum - 1) * pageSize); //System.out.println(start); // 终止位置 int end = pageNum <= 0 ? (pageSize <= count ? pageSize : count) : (pageSize * pageNum <= count ? pageSize * pageNum : count); //System.out.println(end); return list.subList(start, end); }