Stream的limit
方法返回一个新的流,该流的元素被截断为给定的最大长度。limit
方法包含前n个元素,其中n小于或等于给定的最大大小。
在javadoc中的limit
方法声明。
Stream<T> limit(long maxSize)
参数:参数maxSize
是limit
返回的流中的最大元素数。
返回:limit
方法返回新的流。
异常:如果参数maxSize
输入类型不正常,则该方法抛出IllegalArgumentException
。
limit
方法是一种短路状态的中间操作(short-circuiting stateful intermediate operation
)。
流操作分为中间作业和终端作业,并结合起来形成流管道。如果中间操作可以为无限输入生成有限流,则它是短路(short-circuiting
)。中间操作分为无状态操作和有状态操作。
在处理诸如filter
和map
这样的新元素时,无状态操作不会保留以前看到的元素的状态。
有状态操作可以在处理诸如distinct
和limit
之类的新元素时合并以前看到的元素的状态。
注意:limit
方法在顺序流管道上是一种低消耗的操作,对于有序的并行管道,尤其是对于maxSize
值较大的管道,其代价可能很高。这是因为limit(maxSize)
被绑定返回遇到顺序中的第一个maxSize
元素,而不是任何maxSize
数字元素。
下面我们来看一些limit
方法的例子
示例1:
假设我们有一个数字流,并对其调用limit
方法。
Stream.of(11, 12, 13, 14, 15).limit(3)
.forEach(s->System.out.println(s));
源流有5个数字,我们调用了limit(3)
,最大大小是3。因此,我们的输出将从第一个元素开始最多3个元素,即11 12 13。
如果limit
的最大大小大于元素个数,则stream
中的所有元素都将被limit
方法选中。
Stream.of("A", "B", "C", "D").limit(10)
.forEach(s->System.out.println(s));
我们可以看到源流有4个元素,而我们调用的limit
的最大大小是10。这里limit
将返回包含所有元素的流,输出将是 A B C D。
示例2:
我们再看一个例子
LimitDemo2.java
package com.concretepage;
import java.util.Arrays;
import java.util.List;
public class LimitDemo2 {
public static void main(String[] args) {
System.out.println("--- code 1 ---");
List<String> list = Arrays.asList("Vijay", "Suresh", "Vinod");
list.stream()
.map(e -> "Mr. " + e)
.limit(2)
.forEach(s->System.out.printf("%s ", s));
System.out.println("\n--- code 2 ---");
List<Integer> numList = Arrays.asList(31, 32, 33, 34);
numList.stream()
.mapToInt(i -> i * 10)
.limit(3)
.forEach(s->System.out.printf("%s ", s));
}
}
输出
--- code 1 ---
Mr. Vijay Mr. Suresh
--- code 2 ---
310 320 330
示例3:
在并行流中的limit
方法的例子
LimitDemo3.java
package com.concretepage;
import java.util.Arrays;
import java.util.List;
public class LimitDemo3 {
public static void main(String[] args) {
System.out.println("--- code 1 ---");
List<String> list = Arrays.asList("Varanasi", "Madurai", "Agartala");
list.parallelStream()
.limit(2)
.forEach(s->System.out.printf("%s ", s));
System.out.println("\n--- code 2 ---");
List<Integer> numList = Arrays.asList(41, 42, 43, 44);
numList.parallelStream()
.mapToInt(i -> i * 10)
.limit(3)
.forEach(s->System.out.printf("%s ", s));
}
}
输出
--- code 1 ---
Madurai Varanasi
--- code 2 ---
420 410 430