limit()用于截取Stream前N个元素,返回新流;n≥0,n为0得空流,n超长则返回全部;可链式调用,作用于filter/map后结果;对无限流是必要终止操作;属短路操作,提升性能。

stream().limit() 是 Java Stream API 中用于截取流的前 N 个元素的方法,它返回一个新流,最多包含指定数量的元素。一旦达到限制数量,后续元素会被自动丢弃,不参与后续操作。
基本用法:直接限制元素个数
调用 limit(n) 时,n 必须是非负整数(n ≥ 0)。如果 n 为 0,结果是空流;如果 n 大于流中实际元素数,就返回全部元素,不会报错。
- 示例:从列表中取前 3 个字符串
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
List<String> result = list.stream()
.limit(3)
.collect(Collectors.toList());
// 结果:["a", "b", "c"]和 filter()、map() 等组合使用很常见
limit 是中间操作,可以链式调用在其他中间操作之后。注意执行顺序:filter → map → limit,意味着 limit 作用的是已过滤/转换后的流。
- 先过滤偶数,再取前 2 个平方值
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> squares = nums.stream()
.filter(x -> x % 2 == 0) // [2, 4, 6]
.map(x -> x * x) // [4, 16, 36]
.limit(2) // 取前两个
.collect(Collectors.toList());
// 结果:[4, 16]注意:limit 对无限流特别有用
配合 Stream.iterate 或 Stream.generate 创建的无限流,limit() 是必须的终止手段,否则会一直运行下去。
立即学习“Java免费学习笔记(深入)”;
- 生成前 5 个斐波那契数
Stream.iterate(new int[]{0, 1}, t -> new int[]{t[1], t[0] + t[1]})
.limit(5)
.map(t -> t[0])
.forEach(System.out::println);
// 输出:0 1 1 2 3性能提示:limit 是短路操作
当流支持短路(如基于集合或数组的流),limit 在拿到足够元素后会停止处理后续数据,提升效率。但对某些并行流或自定义 Spliterator,短路行为可能受限,实际效果依赖底层实现。
- 避免在 limit 前做重操作(如复杂 map)——因为 limit 后面的元素可能根本不用计算
- 如果目标只是“取前 N 条”,且数据源可排序,考虑数据库分页更高效;Java 层 limit 更适合内存中轻量筛选


















