Java对List集合进行分页的四种写法
方法一:使用subList方法
利用List的subList
方法直接截取需要的数据范围,简单高效。
public static <T> List<T> paginateBySubList(List<T> list, int pageNum, int pageSize) {
if (list == null || list.isEmpty()) {
return Collections.emptyList();
}
int total = list.size();
int fromIndex = (pageNum - 1) * pageSize;
if (fromIndex >= total) {
return Collections.emptyList();
}
int toIndex = Math.min(fromIndex + pageSize, total);
return list.subList(fromIndex, toIndex);
}
// 调用示例
List<Integer> dataList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
List<Integer> pageData = paginateBySubList(dataList, 2, 3);
System.out.println(pageData); // 输出[4, 5, 6]
方法二:使用Stream API
Java 8的Stream API提供更灵活的切片操作,适合复杂数据处理场景。
public static <T> List<T> paginateByStream(List<T> list, int pageNum, int pageSize) {
return Optional.ofNullable(list)
.orElseGet(Collections::emptyList)
.stream()
.skip((pageNum - 1) * pageSize)
.limit(pageSize)
.collect(Collectors.toList());
}
// 调用示例
List<String> stringList = Arrays.asList("A", "B", "C", "D", "E");
List<String> result = paginateByStream(stringList, 1, 2);
System.out.println(result); // 输出[A, B]
方法三:使用Apache Commons工具类
借助ListUtils.partition
实现快速分块,适合需要物理分页的场景。
// 需添加依赖:org.apache.commons:commons-collections4
public static <T> List<T> paginateByApacheCommons(List<T> list, int pageNum, int pageSize) {
List<List<T>> partitions = ListUtils.partition(list, pageSize);
return partitions.size() >= pageNum ? partitions.get(pageNum - 1) : Collections.emptyList();
}
// 调用示例
List<Double> doubleList = Arrays.asList(1.1, 2.2, 3.3, 4.4);
List<Double> part = paginateByApacheCommons(doubleList, 2, 2);
System.out.println(part); // 输出[3.3, 4.4]
方法四:使用Google Guava工具包
通过Lists.partition
实现内存分页,适合大数据量分批处理。
// 需添加依赖:com.google.guava:guava
public static <T> List<T> paginateByGuava(List<T> list, int pageNum, int pageSize) {
List<List<T>> partitions = Lists.partition(list, pageSize);
return partitions.size() >= pageNum ? partitions.get(pageNum - 1) : Collections.emptyList();
}
// 调用示例
List<Character> charList = Arrays.asList('a', 'b', 'c', 'd');
List<Character> guavaResult = paginateByGuava(charList, 1, 3);
System.out.println(guavaResult); // 输出[a, b, c]
性能对比与选型建议
- subList:原集合修改会影响分页结果,适合小数据量且不要求数据隔离的场景
- Stream API:函数式风格,适合需要链式处理的业务逻辑
- Apache Commons:产生真正的子列表副本,适合需要数据隔离的场景
- Guava:与Apache Commons类似,但提供更丰富的集合操作功能
所有方法均需注意:
- 页码从1开始计算
- 处理空集合和越界情况
- 大数据量建议结合数据库分页