第一种情况:先查询出所有记录,再进行分页处理(分页中可以异步处理)
优化前:
List<String> list = Arrays.asList("1","2","3","4","5","6","7","8");
for (int i = 0; ; i++) {
List<String> list1 = list.stream().skip(i* 2L).limit(2).collect(Collectors.toList());
System.out.print(list1.size()+",");
if(list1.size()<2){
break;
}
System.out.println(list1);
}
优化后:
public class PaginationExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8");
int pageSize = 2;
for (int i = 0; i < Math.ceil((double) list.size() / pageSize); i++) {
int start = i * pageSize;
int end = Math.min(start + pageSize, list.size());
List<String> subList = list.subList(start, end);
System.out.print(subList.size() + ",");
System.out.println(subList);
}
}
}
优化说明:
使用 subList: 替换 stream 操作为 list.subList(),可以直接获取指定范围的子列表,这样可以减少流的创建和操作的开销。
计算页数: 使用 Math.ceil 来计算总页数,避免了不必要的无限循环。
合理计算结束索引: 使用 Math.min 确保结束索引不会超过列表的大小,从而避免了 IndexOutOfBoundsException。
这样优化后的代码既简洁又高效,适合处理大规模数据的分页处理。
第二种情况:不用获取总记录数,直接分页查询(一页一页的处理)
int pageNum=0;
int pageSize=5;
List<String> currentPageList;
do {
//数据库分页查询
currentPageList = mapper.selectByPage(pageNum * pageSize, pageSize);
if (!currentPageList.isEmpty()) {
System.out.println(currentPageList);
pageNum++;
}
} while (!currentPageList.isEmpty());