簡體   English   中英

java-8 streams:來自中間操作的新流是否在不增加內存的情況下返回?

[英]java-8 streams : Are new streams from intermediate operations returned without increase in memory?

我試圖詳細了解java-8流。

上的oracle文檔頁面:

Streams在幾個方面與集合不同:

沒有存儲空間 流不是存儲元素的數據結構; 相反,它通過計算操作管道傳遞來自諸如數據結構,數組,生成器函數或I / O通道的源的元素。

流操作和管道

流操作分為中間操作和終端操作,並組合成流管道。

流管道由源(例如集合,數組,生成器函數或I / O通道)組成; 然后是零個或多個中間操作,例如Stream.filter或Stream.map; 和一個終端操作,如Stream.forEach或Stream.reduce。

中間操作返回一個新流

除了文檔,我還經歷了相關的SE問題:

Java中的流如何影響內存消耗?

引用的所有地方都說由於流操作的管道襯里而沒有消耗額外的內存。 原始流將通過管道傳遞。

本傑明博客的一個工作實例:

List<String> myList =
    Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
    .stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

但是當像filter, map and sorted這樣的中間操作返回新流時,為什么它不會增加內存消耗? 我在這里錯過了什么嗎?

我認為你在字面上解釋了文檔中的“無存儲”部分,因為“沒有內存增加”。 這種解釋是錯誤的:“無存儲”意味着“沒有存儲流元素”。 Stream對象本身表示固定開銷,與空集合具有一些開銷的方式相同,因此流本身的大小不計算在內。

但是當像filter,map和sorted這樣的中間操作返回新流時,為什么它不會增加內存消耗?

確實如此。 然而,尺寸的增加是固定的,即O(1)增加。 這與集合形成對比,集合中制作n元素集合的副本的增加是O(n)。

請嘗試閱讀http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html和/或http://winterbe.com/posts/2014/07 / 31 / java8-stream-tutorial-examples / ,我想,你試圖弄清楚的概念得到了很好的解釋。

基本上你可以看到的是,對於大多數中間操作,它們並不是每次操作都會同時發生。 一次1個元素,它們通過所有中間操作處理,並根據終端操作丟棄或放入集合/添加到總和/打印等。 如果它是一個收集類型的終端操作,那么在創建這個新集合時當然會有一些內存開銷,但是在流中單獨保存沒有任何東西。 這也是為什么你不能兩次(部分)迭代流的原因。

但是有一些操作,例如stream.sorted(func),在處理過程中可能需要一些狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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