[英]Understanding java Stream.limit() operation
我正在学习Stream.limit()
说:
返回由该流的元素组成的流,其长度被截断为不超过maxSize。
从以下内容可以理解:
Stream.of(1,2,3,4,5,6,7,8)
.limit(3)
.forEach(i -> {
System.out.print(i + ",");
}); //prints: 1,2,3,
但是,当与其他流方法一起使用时,它会批量处理元素:
Stream.of(1,2,3,4,5,6,7)
.filter(i -> {
System.out.println("Filtering " + i + ": " + (i%2 == 0));
return i%2 == 0;
})
.map(i-> {
System.out.println("Mapping " + i + " to " + i*i);
return i*i;
})
.limit(2)
.forEach(i -> System.out.println("---> " + i));
印刷品:
Filtering 1: false
Filtering 2: true
Mapping 2 to 4
---> 4
Filtering 3: false
Filtering 4: true
Mapping 4 to 16
---> 16
在这里,您可以看到元素以2批处理。
我有以下疑问:
为什么它不只处理前两个元素1和2? 也就是说,为什么输出不只是:
Filtering 1: false Filtering 2: true Mapping 2 to 4 ---> 4
为什么它不处理最后四个元素5,6,7和8并打印以下内容?:
Filtering 5: false Filtering 6: true Mapping 6 to 36 ---> 36 Filtering 7: false Filtering 8: true Mapping 8 to 64 ---> 64
1
和2
均已处理。 1
为奇数,因此filter
将其从流管道中删除。 2
是偶数并且通过了整个流管道,导致4
在forEach
中打印出来。
溪流本质上是懒惰的。 由于您使用的limit(2)
只有两个元素将使其通过limit
管道的一步。 2
和4
经过整个流管道,导致4
和16
在forEach
中打印出来。
根据docs , limit()
是一种短路的有状态中间操作:
诸如limit(n)或findFirst()之类的短路操作可以允许对无限流的计算在有限时间内完成。
...
此外,一些操作被认为是短路操作。 如果出现无限输入时,中间操作可能会短路,这可能会导致产生有限流。 如果出现无限输入时,端子操作可能会在有限时间内终止,则该端子操作会发生短路。 在管道中进行短路操作是使无限流的处理在有限时间内正常终止的必要条件,但还不够。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.