ZetCode

Java Stream skip

最后修改于 2025 年 5 月 25 日

本文演示如何使用 Java Stream skip 方法来跳过 stream 开头的元素。

skip 方法是 Java Streams 中的一个中间操作,它允许选择性地省略 stream 中的前 N 个元素。 它返回一个新的 stream,其中仅包含剩余的元素,并保留其原始顺序。

如果 stream 的元素少于 N 个,则返回一个空 stream,从而确保在请求跳过的元素数量超过 stream 大小时的安全和可预测的行为。

基本 skip 语法

skip 方法允许您跳过 stream 开头的指定数量的元素,并返回一个包含剩余元素的新 stream。

skip 方法的签名是

Stream<T> skip(long n)

参数 n 是要跳过的开头元素的数量。 对于有序 stream,前 n 个元素按遇到顺序丢弃。 对于无序 stream,可以丢弃任何 n 个元素。

跳过有序 stream 中的元素

您可以将 skip 与有序 stream 一起使用,以忽略前 n 个元素并按其原始顺序处理其余元素。

有序 stream 的基本用法。

Main.java
void main() {

    Stream.of("A", "B", "C", "D", "E", "F")
          .skip(3)
          .forEach(System.out::println);
}

此示例跳过前 3 个元素(“A”、“B”、“C”),并处理剩余的元素(“D”、“E”、“F”)。

$ java Main.java
D
E
F

跳过比可用元素更多的元素

如果您跳过的元素比 stream 包含的元素多,则结果是一个空 stream。

跳过比 stream 包含的元素更多时的行为。

Main.java
void main() {

    long count = Stream.of(1, 2, 3)
                      .skip(5)
                      .count();
    
    System.out.println("Remaining elements: " + count);
}

此示例尝试从仅包含 3 个元素的 stream 中跳过 5 个元素,从而产生一个计数为 0 的空 stream。

$ java Main.java
Remaining elements: 0

将 skip 与 limit 结合使用

结合使用 skiplimit 可以通过从 stream 中选择特定范围的元素来实现高效的分页。

使用 skiplimit 实现分页。

Main.java
void main() {

    int pageSize = 5;
    int pageNumber = 2;
    
    IntStream.rangeClosed(1, 20)
             .skip(pageNumber * pageSize)
             .limit(pageSize)
             .forEach(System.out::println);
}

此示例通过跳过等效于先前页面的元素并限制为当前页面大小来演示分页。

$ java Main.java
11
12
13
14
15

在无序 stream 中跳过

当与无序 stream 一起使用时,skip 可能会丢弃任何 n 个元素,并且剩余元素的顺序没有保证。

无序 stream 的行为。

Main.java
void main() {

    Stream.of("A", "B", "C", "D", "E", "F")
          .unordered()
          .skip(3)
          .forEach(System.out::println);
}

对于无序 stream,skip 可能会丢弃任何元素,而不是严格地丢弃第一个元素。 剩余的元素不保持特定顺序。

过滤后跳过

skipfilter 的顺序会影响跳过哪些元素,因为 skip 在过滤后的 stream 上运行。

skip 和 filter 操作之间的交互。

Main.java
void main() {

    IntStream.rangeClosed(1, 10)
             .filter(n -> n % 2 == 0) // even numbers
             .skip(2) // skip first 2 even numbers
             .forEach(System.out::println);
}

此示例首先过滤偶数(2、4、6、8、10),然后跳过其中的前 2 个(2、4),从而得到 6、8、10。

$ java Main.java
6
8
10

CSV 处理

skip 的一个常见用例是在处理 CSV 数据时忽略标题行。

跳过 CSV 数据中的标题行。

Main.java
void main() {

    String csvData = """
        ID,Name,Age
        1,John,25
        2,Jane,30
        3,Bob,28
        """;
    
    Stream.of(csvData.split("\n"))
          .skip(1) // skip header row
          .map(line -> line.split(","))
          .forEach(fields -> System.out.println(
              "Name: " + fields[1] + ", Age: " + fields[2]));
}

这个常见的用例演示了在处理 CSV 数据时跳过标题行。

$ java Main.java
Name: John, Age: 25
Name: Jane, Age: 30
Name: Bob, Age: 28

来源

Java Stream skip 文档

在本文中,我们探讨了 Java Stream skip 方法。 它提供了一种方便的方式来跳过 stream 中的前导元素,在分页场景以及处理带有标题的结构化数据时尤其有用。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 我从 2007 年开始撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程