java对list集合进行分页的四种写法

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]

性能对比与选型建议
  1. subList:原集合修改会影响分页结果,适合小数据量且不要求数据隔离的场景
  2. Stream API:函数式风格,适合需要链式处理的业务逻辑
  3. Apache Commons:产生真正的子列表副本,适合需要数据隔离的场景
  4. Guava:与Apache Commons类似,但提供更丰富的集合操作功能

所有方法均需注意:

  • 页码从1开始计算
  • 处理空集合和越界情况
  • 大数据量建议结合数据库分页
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值