skip与limit组合实现分页的核心是“先跳过前n个,再取m个”,必须先skip后limit,顺序错误会导致结果为空;第page页(每页size条)对应skip((page-1)*size).limit(size)。

用 skip 和 limit 截取中间片段,核心是“先跳过前 N 个,再取 M 个”,二者组合就是天然的分页/切片工具。
理解 skip 与 limit 的执行顺序
skip(n) 丢弃流中前 n 个元素,limit(m) 则最多保留后续的 m 个元素。它们是**短路操作**,且顺序敏感:必须先 skip 再 limit,否则会截断错误位置。
- ✅ 正确:stream.skip(5).limit(3) → 跳过前 5 个,取接下来的 3 个(即第 6、7、8 个)
- ❌ 错误:stream.limit(3).skip(5) → 先只留前 3 个,再跳过 5 个 → 结果为空流
模拟分页:获取第 page 页(每页 size 条)的数据
这是最常见场景。第 1 页从索引 0 开始,第 2 页从索引 size 开始,依此类推。起始偏移量 = (page - 1) * size。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 第 3 页,每页 10 条 → skip(20).limit(10)
- 代码示例:
Listpage3 = list.stream()
.skip((3L - 1) * 10)
.limit(10)
.collect(Collectors.toList());
安全截取:避免越界导致空结果或异常
skip 和 limit 本身不会抛异常,但若跳过数超过流长度,结果为空;若 limit 超出剩余元素数,也只返回实际存在的元素。无需额外判空,但要注意语义:
- 想严格保证返回 10 条?需先检查源数据 size,或改用其他方式(如 List.subList)
- 仅用于展示(如前端分页),空结果可直接渲染“无数据”,无需干预
- 注意:Stream 不支持随机访问,无法像 List 那样直接 get(i),所以 skip+limit 是标准解法
配合其他操作提升实用性
单独用 skip+limit 场景有限,常与其他操作链式组合:
- 排序后分页:
stream.sorted(comparator).skip(...).limit(...)(注意:排序必须在 skip 前,否则逻辑错乱) - 过滤后切片:
stream.filter(...).skip(...).limit(...),适合查“状态=启用”的第 2 页数据 - 避免重复计算:若流来自耗时操作(如数据库查询),优先在数据源层分页(如 SQL 的 LIMIT/OFFSET),Stream 分页更适合内存集合或小数据量
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










