在Java的Stream API中,limit()和skip()是两个常用的中间操作,二者配合可以轻松实现流的分页截取功能,无需手动遍历集合计算分页范围。

limit()和skip()方法基础说明
skip(long n)方法
skip()方法用于跳过流中的前n个元素,返回一个丢弃了前n个元素的新流。如果流中的元素数量小于n,会返回一个空流。该方法是惰性的,不会立即执行,只有在终止操作触发时才会生效。
limit(long maxSize)方法
limit()方法用于截断流,使流的最大长度不超过maxSize,返回一个包含原流中前maxSize个元素的新流。如果原流的元素数量小于maxSize,则返回原流。同样属于惰性操作,不会提前消费流数据。
分页截取的实现逻辑
要实现分页功能,需要明确两个核心参数:当前页码pageNum(从1开始计数)和每页显示数量pageSize。分页截取的计算逻辑如下:
- 需要跳过的总元素数 = (pageNum - 1) * pageSize,这个值作为
skip()的参数 - 需要截取的元素总数 = pageSize,这个值作为
limit()的参数
整体调用顺序为先调用skip()跳过前面的元素,再调用limit()截取当前页需要的元素,最后通过终止操作获取结果。
完整代码示例
以下是一个模拟用户列表分页的示例,假设有一个包含20个用户的集合,实现每页5条数据的分页查询:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class StreamPageDemo {
public static void main(String[] args) {
// 模拟生成20个用户数据
List<String> userList = new ArrayList<>();
for (int i = 1; i <= 20; i++) {
userList.add("用户" + i);
}
// 分页参数:查询第2页,每页5条数据
int pageNum = 2;
int pageSize = 5;
// 计算需要跳过的元素数量
long skipNum = (pageNum - 1) * pageSize;
// 使用skip和limit实现分页截取
List<String> pageData = userList.stream()
.skip(skipNum) // 跳过前5个元素(第1页的5条数据)
.limit(pageSize) // 截取接下来的5个元素(第2页的5条数据)
.collect(Collectors.toList());
// 输出分页结果
System.out.println("第" + pageNum + "页数据:");
pageData.forEach(System.out::println);
}
}
上述代码执行后,会输出用户6到用户10,符合第2页的分页预期。
注意事项和适用场景
- 如果
skip()的参数小于等于0,不会跳过任何元素;如果limit()的参数小于等于0,会返回空流。 - 这两个方法适用于已经存在于内存中的集合数据的分页,如果是数据库查询等场景,优先使用数据库本身的分页语句,效率更高。
- 流只能被消费一次,分页操作完成后如果需要再次分页,需要重新创建流。
- 当
skip()跳过的元素数量超过流的总长度时,后续limit()操作会返回空流,不会抛出异常。
需要注意的是,Stream的skip()和limit()是有序操作,对于有序流(如从List生成的流),分页结果会和原始集合的顺序保持一致;对于无序流(如从Set生成的流),分页结果的元素顺序可能不固定。
Stream_limitStream_skip流分页Java_stream修改时间:2026-07-01 06:03:24