skip(n)是Stream中间操作,返回新流且懒加载,需终端操作才生效;跳过数超流长时返回空流;常与limit组合实现分页,适用于各类流。

Java 中用 skip(n) 跳过流中前 n 个元素,它属于 Stream 接口的中间操作,返回一个新流,不修改原流。
skip 是懒加载的,必须配合终端操作才生效
单独调用 stream.skip(3) 不会执行跳过动作,也不会触发任何计算。只有在后续接上 forEach、collect、count 等终端操作时,跳过逻辑才会实际运行。
- 错误写法(无效果):
list.stream().skip(2); - 正确写法:
list.stream().skip(2).forEach(System.out::println);
skip 超出流长度时不会报错,而是返回空流
如果要跳过的数量大于流中实际元素个数,结果是一个空流(count() == 0,findFirst() 返回 Optional.empty()),不会抛异常。
- 例如:
Arrays.asList(1, 2).stream().skip(5).count()→ 结果是0 - 适合用于“取后 N 个”这类场景,无需提前判断长度
与 limit 搭配实现“分页”或“取中间段”
skip(m).limit(n) 是常用组合,等价于“跳过前 m 个,再取最多 n 个”,常用于模拟分页(如第 2 页,每页 10 条):
立即学习“Java免费学习笔记(深入)”;
- 第 2 页(页码从 0 开始):
stream.skip(10).limit(10) - 第 3 页:
stream.skip(20).limit(10) - 注意:对无序流(如
Collection.stream())结果稳定;对并行流或某些来源(如Files.lines()),顺序仍由源保证,skip 行为不变
skip 对基本类型流和引用类型流都适用
无论是 Stream<String>、IntStream 还是 LongStream,都有对应的 skip 方法,语义一致:
-
IntStream.range(0, 10).skip(3).forEach(System.out::println);→ 输出 3 到 9 -
Stream.of("a", "b", "c", "d").skip(1).toArray(String[]::new);→["b", "c", "d"]


















