ZetCode

Java Stream limit

最后修改于 2025 年 5 月 25 日

本文探讨 Java Stream 中的 limit 方法,展示如何有效地限制 Stream 中处理的元素数量。

limit 方法是一个中间操作,它会截断 Stream,以确保它包含不超过指定数量的元素。 当处理无限 Stream 或从大型数据集中提取可管理的子集时,此功能特别有用。

基本 limit 语法

limit 方法将 Stream 中的元素数量限制为指定的最大值,并返回一个最多包含那么多元素的新 Stream。

$ java Main.java
Stream<T> limit(long maxSize)

参数 maxSize 是 Stream 应包含的最大元素数量。如果 Stream 中的元素少于 maxSize,则它保持不变。

限制有限 Stream

您可以将 limit 与有限 Stream 结合使用,以仅处理前 n 个元素并丢弃其余元素。

Main.java
void main() {

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

此示例将 Stream 限制为前 3 个元素(“A”、“B”、“C”),丢弃其余元素。

$ java Main.java
A
B
C

处理无限 Stream

limit 方法对于使无限 Stream 变为有限且可管理至关重要,它通过将它们截断为固定数量的元素来实现。

Main.java
void main() {

    Stream.generate(() -> (int)(Math.random() * 100))
          .limit(5)
          .forEach(System.out::println);
}

此示例生成一个无限的随机数 Stream,但将其限制为 5 个元素,从而可以进行处理。

与 skip 结合使用进行分页

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

Main.java
void main() {

    int pageSize = 4;
    int pageNumber = 1; // zero-based
    
    IntStream.rangeClosed(1, 20)
             .skip(pageNumber * pageSize)
             .limit(pageSize)
             .forEach(System.out::println);
}

这种常见的模式会跳过之前页面的元素,并限制为当前页面大小(在本例中为元素 5-8)。

$ java Main.java
5
6
7
8

与 filter 结合使用

limitfilter 操作的顺序决定了包含哪些元素,因为 limit 在过滤后应用。

Main.java
void main() {

    IntStream.rangeClosed(1, 100)
             .filter(n -> n % 3 == 0)
             .limit(5)
             .forEach(System.out::println);
}

此示例查找能被 3 整除的数字,但将结果限制为前 5 个匹配项(3、6、9、12、15)。

前 N 个结果

limit 的一个常见用例是从处理后的 Stream 中检索前 N 个结果,例如最高值或最相关的项目。

Main.java
record Product(String name, BigDecimal price) {
}

void main() {
    Stream.of(
            new Product("Laptop", new BigDecimal("999.99")),
            new Product("Phone", new BigDecimal("699.99")),
            new Product("Tablet", new BigDecimal("349.99")),
            new Product("Monitor", new BigDecimal("249.99")),
            new Product("Keyboard", new BigDecimal("49.99"))
        )
        .sorted((p1, p2) -> p2.price().compareTo(p1.price())) // BigDecimal sorting
        .limit(3)
        .forEach(p -> System.out.println(p.name() + ": $" + p.price()));
}

这种常见的模式按价格(降序)对产品进行排序,并限制为前 3 个最昂贵的商品。

$ java Main.java
Laptop: $999.99
Phone: $699.99
Tablet: $349.99

来源

Java Stream limit 文档

在本文中,我们探讨了 Java Stream 的 limit 方法。 它是控制 Stream 大小的重要工具,可以通过限制处理的元素数量来实现对无限 Stream 和大型数据集的有效处理。

作者

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

列出所有Java教程