java stream的limit()和skip()可实现轻量级分页,但仅适用于有序、可重复遍历的数据源(如已排序list);limit(n)取前n个元素,skip(n)跳过前n个元素,组合使用skip((pagenum-1)*pagesize).limit(pagesize)实现分页,且每次需基于原始数据重建流。

Java Stream 的 limit() 和 skip() 方法可用于实现轻量级分页逻辑,但需注意它们是**中间操作、有状态、且不适用于并行流的可靠分页**——尤其当原始数据无序或来源非 List 时,结果可能不稳定。
limit():取前 N 个元素
limit(n) 返回一个最多包含前 n 个元素的新流。一旦达到 n 个元素,后续元素会被截断。
- 如果流中元素少于 n 个,返回全部元素,不会报错
- 适合“取第 1 页”或“取前几条”的场景,例如获取热门商品前 5 名
- 示例:
list.stream().limit(5).collect(Collectors.toList())
skip():跳过前 N 个元素
skip(n) 返回跳过前 n 个元素后剩余部分的新流。
- 若 n 大于流长度,结果为空流(
count() == 0),安全无异常 - 常用于“跳过已处理项”,比如分页中跳过前几页的数据
- 示例:
stream.skip(10)表示跳过前 10 条,从第 11 条开始
组合 limit + skip 实现分页(pageNum, pageSize)
标准公式为:skip((pageNum - 1) * pageSize).limit(pageSize)。注意:该方式要求原始流**有序且可重复遍历**(如来自 List 或数据库已排序结果),否则页内数据可能重复或遗漏。
- 第 1 页(pageNum=1, size=5)→
skip(0).limit(5) - 第 2 页(pageNum=2, size=5)→
skip(5).limit(5) - 第 3 页(pageNum=3, size=5)→
skip(10).limit(5)
⚠️ 重要提醒:Stream 不是集合,不可重用;每次分页都应基于原始数据源重新创建流。不要对同一个 stream 反复调用 skip/limit。
实际分页工具方法(带边界校验)
建议封装成静态工具方法,避免负数或越界导致空结果却不报错:
public static <t> List<t> paginate(List<t> data, int pageNum, int pageSize) {
if (pageNum <p>使用时传入 <strong>已排序的 List</strong>(如查库后 <code>ORDER BY</code> 的结果),才能保证分页语义正确。</p></t></t></t>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











