簡體   English   中英

Java-Stream - 具有無限流的 mapMulti()

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM