需求场景
从数据库查出来一堆数据,需要你进行分页以及按里面一些参数进行排序,恰好你不熟悉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);
}