Java List分页工具类

你的名字 2024-04-06 14:39 207阅读 0赞
  1. /**
  2. * List分页工具
  3. */
  4. @Slf4j
  5. public class ListPagHelper<T> {
  6. private int total;
  7. private List<T> dataList;
  8. public ListPagHelper(List<T> list, int pageNum, int pageSize) {
  9. this.total = list.size();
  10. int size = pageNum * pageSize > total ? total : pageNum * pageSize;
  11. int startNum = (pageNum - 1) * pageSize;
  12. if (startNum > size){
  13. startNum = 1;
  14. }
  15. dataList = list.subList(startNum, size);
  16. }
  17. public static <T> List<T> paging(List<T> list, int pageNum, int pageSize){
  18. int total = list.size();
  19. int size = pageNum * pageSize > total ? total : pageNum * pageSize;
  20. int startNum = (pageNum - 1) * pageSize;
  21. if (startNum > size){
  22. startNum = 1;
  23. }
  24. return list.subList(startNum, size);
  25. }
  26. /**
  27. * 将一个 list 集合, 分割成指定大小的"块"
  28. *
  29. * 主要用于大数据量的入库
  30. * 注: 此方法进行分割的 list 为只读状态, 不能进行其他操作
  31. * @param list 原始 list 列表
  32. * @param batchSize 指定每一"块"的数量
  33. * @return
  34. */
  35. public static <T> List<List<T>> subList(List<T> list, int batchSize){
  36. //总数
  37. int len = list.size();
  38. if (batchSize == 0){
  39. batchSize = 1;
  40. }
  41. //轮数
  42. int times = len / batchSize;
  43. //如果不能整除,则要多跑一轮
  44. if(len%batchSize != 0){
  45. times++;
  46. }
  47. log.info("总共 {} 条记录, 分割为 {} 块", len, times);
  48. List<List<T>> resList = new ArrayList<>(times);
  49. int start = 1;
  50. int end = 1;
  51. for(int i=1;i<=times; i++){
  52. start = (i-1) * batchSize;
  53. end = start + batchSize;
  54. //最后一轮数据未满
  55. if(end>=len){
  56. end = len;
  57. }
  58. //子集为开区间[0,len) =[0, len-1]
  59. List<T> subNewList = list.subList(start,end);
  60. resList.add(subNewList);
  61. }
  62. return resList;
  63. }
  64. public static <T> List<List<T>> subList(List<T> list){
  65. return subList(list, StringUtil.TENTHOUSAND);
  66. }
  67. /**
  68. * 将一个 list 集合, 按指定数量分割成块
  69. * 主要用于大数据量的入库
  70. * 注: 此方法进行分割的 list 为只读状态, 不能进行其他操作
  71. * @param times 指定要分割的"块"数
  72. * @param list 原始 list 列表
  73. * @return
  74. */
  75. public static <T> List<List<T>> subList(Integer times, List<T> list){
  76. //总数
  77. int len = list.size();
  78. // 使用 int 型计算每页数量会自动舍去小数位, 可能导致最终分割数量超出指定数
  79. // 这里需要先转换成 double 型计算每"块"数量, 再将计算结果向上取整
  80. double block = times.doubleValue();
  81. int batchSize = (int) Math.ceil(len / block);
  82. log.info("总共 {} 条记录, 分割为 {} 块, 每块 {} 条", len, times, batchSize);
  83. List<List<T>> resList = new ArrayList<>(times);
  84. int start = 1;
  85. int end = 1;
  86. for(int i=1;i<=times; i++){
  87. start = (i-1) * batchSize;
  88. end = start + batchSize;
  89. //最后一轮数据未满
  90. if(end>=len){
  91. end = len;
  92. }
  93. //子集为开区间[0,len) =[0, len-1]
  94. List<T> subNewList = list.subList(start,end);
  95. resList.add(subNewList);
  96. }
  97. return resList;
  98. }
  99. public int getTotal() {
  100. return total;
  101. }
  102. public List<T> getDataList() {
  103. return dataList;
  104. }
  105. }

发表评论

表情:
评论列表 (有 0 条评论,207人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java手动工具

    > 开发中,碰到了一些奇葩的业务逻辑,无法使用框架自身的分页功能,想了很久最后还是决定自己手写一个分页工具类,以备后续参考和使用,下面直接上代码, /