[英]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.