stream.skip(n)跳过前n个元素返回新流,不修改原流且懒加载;n≤0返回原流,n≥流长返回空流,负n抛illegalargumentexception;常与limit联用分页,顺序流行为确定,并行流在无序源上结果可能不可预测。

Stream.skip(N) 会跳过流中前 N 个元素,返回一个新流,包含从第 N+1 个开始的剩余元素。它不修改原流,且是懒加载操作——只有在终端操作触发时才真正执行。
skip 的基本用法
调用 stream.skip(n) 后,必须配合终端操作(如 forEach、collect、toArray)才能看到效果。单独调用不会触发任何处理。
- 如果 N ≤ 0,返回原流(不跳过任何元素)
- 如果 N ≥ 流长度,返回空流(所有元素都被跳过)
- N 必须是非负整数,否则抛出
IllegalArgumentException
常见使用场景示例
比如分页获取数据:取第 2 页(每页 5 条),即跳过前 5 条,再取 5 条:
List<string> list = Arrays.asList("a", "b", "c", "d", "e", "f", "g", "h");
List<string> page2 = list.stream()
.skip(5) // 跳过前 5 个
.limit(5) // 取接下来的 5 个
.collect(Collectors.toList());
// 结果:["f", "g", "h"]
</string></string>
注意:实际分页时要结合 limit 使用,否则可能拿到大量无关数据。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
skip 和顺序/并行流的关系
skip 在顺序流中按自然顺序跳过前 N 个;在并行流中,虽然结果仍保证逻辑上“跳过前 N 个”,但内部划分方式可能导致性能不如顺序流稳定——尤其对无序源(如 HashSet)或未定义 encounter order 的流,跳过行为可能不可预测。
- 建议对有明确顺序的数据(如 List、数组)使用 skip
- 避免在无序集合(如 ConcurrentSkipListSet 以外的 Set)上依赖 skip 的“前 N”语义
- 并行流中 skip 的开销可能更高,除非数据量极大且后续操作计算密集
注意事项和陷阱
skip 是中间操作,多次调用会叠加效果,但要注意短路和空流情况:
-
Stream.empty().skip(100)仍是空流 -
Stream.of("x").skip(1).findFirst()返回Optional.empty() - 对无限流(如
Stream.iterate)使用 skip 是安全的,但必须配合 limit 或其他短路操作,否则终端操作无法结束
不复杂但容易忽略:skip 不会提前终止流的生成,只是丢弃前 N 个;若上游是耗时计算,这些被跳过的元素依然会被创建和处理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










