skip(n)是stream的惰性中间操作,跳过前n个元素返回新流;n≤0时无跳过,n≥元素数时返回空流;常与limit分页,但大数据量效率低;排序后使用需先sorted再skip;并行流中依赖源的遭遇顺序。

Java 的 Stream API 中,skip(n) 是一个中间操作,用于跳过流中前 n 个元素,返回剩余元素组成的新流。它不会修改原流,也不触发执行(惰性求值),只有在遇到终端操作(如 forEach、collect、count)时才真正生效。
skip 的基本用法
skip(long n) 接收一个非负整数参数:
- 若
n小于等于 0,等价于不跳过任何元素; - 若
n大于等于流的总元素数,结果是空流(Stream.empty()); - 若流是无限流(如
Stream.iterate),skip仍可安全使用,但需配合limit等限制操作,否则终端操作可能永不结束。
示例:
List<string> list = Arrays.asList("a", "b", "c", "d", "e");
list.stream().skip(2).forEach(System.out::println); // 输出:c, d, e</string>与 limit 搭配实现分页
skip 常和 limit 组合,模拟数据库的分页查询(如第 2 页,每页 3 条):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 第 1 页(索引 0):
skip(0).limit(3) - 第 2 页(索引 1):
skip(3).limit(3) - 第 n 页:
skip((n - 1) * size).limit(size)
注意:这种方式对大数据量集合效率不高(因需遍历跳过的元素),生产中建议优先由数据库完成分页。
skip 在排序后使用要特别小心
skip 本身不保证顺序,但如果流是有序的(如来自 List 或显式调用 sorted()),则跳过的是逻辑上前 N 个元素。但若先 skip 再 sorted,行为完全不同:
-
stream.sorted().skip(2):先排好序,再跳过最小的两个; -
stream.skip(2).sorted():先丢弃前两个原始元素,再对剩下的排序——结果可能遗漏本该排在前面的值。
分页 + 排序场景应始终先 sorted(),再 skip 和 limit。
skip 对并行流的影响
skip 在并行流中仍保持语义一致:跳过的是流中“按 encounter order(遭遇顺序)”的前 N 个元素。但由于并行处理的不确定性,实际执行时无法预知哪些线程处理了哪些元素,因此:
- 只要源有定义好的顺序(如
ArrayList),结果就确定; - 若源本身无序(如
HashSet.stream().parallel()),skip的“前 N 个”无意义,应避免使用。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










