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 个元素并丢弃其余元素。
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 变为有限且可管理至关重要,它通过将它们截断为固定数量的元素来实现。
void main() { Stream.generate(() -> (int)(Math.random() * 100)) .limit(5) .forEach(System.out::println); }
此示例生成一个无限的随机数 Stream,但将其限制为 5 个元素,从而可以进行处理。
与 skip 结合使用进行分页
结合使用 skip
和 limit
可以通过从 Stream 中选择特定范围的元素来实现有效的分页。
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 结合使用
limit
和 filter
操作的顺序决定了包含哪些元素,因为 limit 在过滤后应用。
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 个结果,例如最高值或最相关的项目。
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
方法。 它是控制 Stream 大小的重要工具,可以通过限制处理的元素数量来实现对无限 Stream 和大型数据集的有效处理。
作者
列出所有Java教程。