limit(n)是stream的懒加载中间操作,返回最多含n个元素的新流;需配合collect等终端操作才生效,常用于无限流截断或与filter/sorted组合实现“先筛后限”。

Java 中用 limit(n) 方法可以截取流的前 n 个元素,它属于 Stream 的中间操作,返回一个新的、最多包含 n 个元素的流。如果原流元素少于 n 个,则返回全部元素,不会报错或补空。
limit 是懒加载的,必须配合终端操作才生效
limit() 本身不触发流的执行,只有在调用 collect()、forEach()、count() 等终端操作时才会真正处理数据。单独写 stream.limit(3) 不会做任何事。
- ✅ 正确写法:
list.stream().limit(3).collect(Collectors.toList()) - ❌ 错误写法:
list.stream().limit(3);(没后续操作,白写)
limit 常与 filter、sorted 等组合使用
它通常放在过滤或排序之后,用于“取前 N 条”。注意顺序很重要:先 filter 再 limit 更高效,避免对大量无关元素排序或处理。
- 推荐:先筛再限 —
stream.filter(x -> x > 10).sorted().limit(5) - 不推荐:先排再限 —
stream.sorted().filter(x -> x > 10).limit(5)(可能排序全部数据)
limit 对无限流特别有用
配合 Stream.iterate 或 Stream.generate 创建的无限流,limit() 是终止它的关键手段。
- 例如生成前 10 个偶数:
Stream.iterate(0, n -> n + 2).limit(10).toList() - 没有
limit(),这类流会一直运行,导致程序卡死或内存溢出
注意 limit 的“数量”是按流中实际到达的元素计数
它统计的是经过前面所有中间操作后、传入 limit 的元素个数,不是原始集合大小。
- 比如
Arrays.asList(1,2,3,4,5).stream().filter(x -> x % 2 == 0).limit(2)→ 得到[2, 4](前两个偶数) - 即使原始列表有 5 个元素,
limit(2)只管最终流里“第 1 个”和“第 2 个”有效元素
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











