分页工具方法

需求场景

从数据库查出来一堆数据,需要你进行分页以及按里面一些参数进行排序,恰好你不熟悉sql(或者懒得改动sql),你可以简单使用下面这个工具类进行分页与排序

实现方法

这段代码定义了一个泛型方法 getListPage,用于对一个 List 进行分页和排序。代码的大致功能如下:

  1. 获取总记录数:通过 list.size() 获取列表的总记录数 count
  2. 空列表检查:如果 count 为 0,直接返回原列表。
  3. 反射获取排序方法:通过反射机制,获取要排序的字段的 getter 方法。
  4. 排序
    • 根据字段类型(StringIntegerDate)分别进行排序。
    • 字符串使用 Collator 进行比较。
    • 整数进行减法比较,并根据 order(排序顺序)决定返回值。
    • 日期类型直接调用 compareTo 进行比较。
  5. 分页
    • 计算总页数 pages
    • 根据 pageNumpageSize 计算起始位置 start 和终止位置 end
    • 返回从 startend 的子列表。

下面是对该代码的详细分析和一些建议:

代码细节分析

  1. 排序条件获取

    final Method method = list.get(0).getClass().getMethod("get" + capitalize(condition));
    • 这里通过反射机制获取排序字段的 getter 方法,capitalize(condition) 是一个假设存在的方法,用于将字段名首字母大写。
  2. 排序实现

    list.sort((o1, o2) -> {
        //...
    });
    • 使用 Listsort 方法,并传入自定义的比较器。
    • 比较器中,根据字段类型进行不同的比较逻辑。
  3. 分页计算

    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
    • 根据 pageNumpageSize 计算起始和结束位置,并返回子列表。

完整代码

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);  
}
版权声明:除特殊说明,博客文章均为栋dong原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。
如有需要,请在留言板留言,或者添加我的QQ或者微信
我只是一个学生,如有错误或者侵权,请联系我,谢!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇