skip (long) 和 limit (long) 的区别?
skip(long)和limit(long)是 Java 8 Stream API 中的中间操作,均用于 “控制流中元素的数量”,但核心逻辑相反:
# 1. 核心定义与作用
- skip(long n):跳过流中前
n个元素,返回剩余元素组成的新流;若n大于流中元素总数,返回空流; - limit(long maxSize):截取流中前
maxSize个元素,返回新流;若maxSize大于流中元素总数,返回原流。
# 2. 关键区别
| 对比维度 | skip(long n) | limit(long maxSize) |
|---|---|---|
| 核心操作 | 跳过前 n 个元素 | 截取前 maxSize 个元素 |
| 对空流的处理 | 返回空流 | 返回空流 |
| 参数超出范围(n/maxSize > 元素总数) | 返回空流 | 返回原流 |
| 执行顺序影响 | 若与 limit 连用,顺序不同结果不同(如skip(2).limit(2) vs limit(2).skip(2)) | 同上 |
# 3. 示例
java
运行
List<Integer> list = Arrays.asList(1,2,3,4,5,6);
// 1. skip(2):跳过前2个元素,返回[3,4,5,6]
list.stream().skip(2).forEach(System.out::print); // 3456
// 2. limit(3):截取前3个元素,返回[1,2,3]
list.stream().limit(3).forEach(System.out::print); // 123
// 3. 连用:skip(2).limit(2) → 跳过前2个,截取后续2个 → [3,4]
list.stream().skip(2).limit(2).forEach(System.out::print); // 34
// 4. 连用:limit(2).skip(2) → 截取前2个,再跳过2个 → 空流
list.stream().limit(2).skip(2).forEach(System.out::print); // 无输出
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 4. 注意事项
- 均为中间操作,惰性执行,需终端操作触发;
- 对有序流(如 List 的流),按元素顺序处理;对无序流(如 Set 的流),处理结果无序;
- 不适用于无限流(如
Stream.generate(() -> 1)),limit可截取有限元素,skip会导致无限等待。
#
上次更新: 12/30/2025