[英]Java-Stream - mapMulti() with Infinite Streams
我認為所有使用flatMap()
編寫的 stream 管道都可以轉換為使用mapMulti
。 當flatMap()
或mapMulti()
在無限 stream 上返回/操作時,看起來我錯了。
注意:這僅用於教育目的
當我們 map 一個元素到無限 stream 在flatMap()
后跟一個limit()
時,stream 管道是惰性的,並根據所需的元素數量進行評估。
list.stream()
.flatMap(element -> Stream.generate(() -> 1))
.limit(3)
.forEach(System.out::println);
Output:
1
1
1
但是當在mapMulti()
中做同樣的事情時,管道仍然是惰性的,即它不會消耗無限的 stream。但是當在 IDE (Intellij) 中運行它時,它掛起並且不會終止(我想等待其他元素消耗)並且不會從 stream 管道執行中出來。
使用mapMulti()
,
list.stream()
.mapMulti((element, consumer) -> {
Stream.generate(() -> 1)
.forEach(consumer);
})
.limit(3)
.forEach(System.out::println);
System.out.println("Done"); //Never gets here
Output:
1
1
1
但是最后一個打印( Done
)沒有被執行。
這是預期的行為嗎? 我在 Javadoc 中找不到關於 infinite stream 和mapMulti()
的任何警告或要點。
mapMulti()
的優點是它消耗成為 stream 一部分的新元素,替換初始元素(與內部為每個元素生成新的 stream 的flatMap()
相反)。 如果您在mapMulti()
中生成一個帶有終端操作的完整 stream,則應該執行它。 並且您創建了一個無法終止的無限 stream(正如@Lino在評論中指出的那樣)。
相反, flatMap()
期望 function 產生 stream,即 function 只返回它而不處理。
這是API 注釋中的一段引述,強調了兩種操作之間的區別:
API 備注:
該方法與
flatMap
類似,對stream的元素進行一對多的變換,將結果元素扁平化為新的stream。在以下情況下,該方法優於flatMap
:
- 當用少量(可能為零)元素替換每個 stream 元素時。 使用此方法可以避免為每組結果元素創建新的 Stream 實例的開銷,如
flatMap
所要求的那樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.