Stream limit(n)用于从Stream中检索一定数量的元素,但数量不能超过n。limit()方法返回一个新的Stream,由给定Stream中的元素组成,截断后长度不超过maxSize。

1.Stream limit()方法

1.1.语法:

Stream<T> limit(long maxSize) 

在这里maxSize是Stream应该限制的元素数量,而方法的返回值是一个由从原始Stream中提取的元素组成的新Stream。

1.2.描述

  • Stream.limit()方法是一种短路中间操作。中间操作是短路操作,当遇到无限输入时,它可能产生一个有限的结果Stream。请注意,终端操作是短路操作,当遇到无限输入时,它可能在有限的时间内终止。
  • 它返回一个由当前Stream的最大元素组成的Stream,长度不超过给定值。
  • 一般来说,limit()是一种高效的操作,但有时如果maxSize值很大且Stream是并行处理的,则可能很低效。
  • 使用无序的Stream源(如generate(Supplier))或用BaseStream.unordered()去除顺序约束可以在并行管道中显著提高limit()的速度。
  • limit()按遇到顺序返回前n个元素。

2.Stream limit()示例

示例1:从无限偶数流中获取前10个偶数

在以下示例中,我们使用iterate()方法创建一个无限流。然后我们使用limit(10)方法获取前10个偶数。

最后,我们使用collect(Collectors.toList())方法将流中的偶数收集到列表中。

Stream<Integer> evenNumInfiniteStream = Stream.iterate(0, n -> n + 2); List<Integer> newList = evenNumInfiniteStream.limit(10) .collect(Collectors.toList()); System.out.println(newList);//[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 

3.skip()和limit()之间的差异

  • limit(N)方法返回前N个元素,按遇到顺序。
  • skip(N)丢弃Stream的前N个元素。
List<Integer> list = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) .skip(6) .collect(Collectors.toList()); System.out.println(newList); //[7, 8, 9, 10] 

4.结论

Java 8 Stream 的 limit() 方法在某些情况下非常有用,当我们需要从流中获取元素,并且在运行时确定元素的数量时。

事实上,它按遇到顺序返回元素,这使得它在正常的业务用例中非常有用。