1. 程式人生 > 其它 >Java基礎:流Stream究竟有什麼好的

Java基礎:流Stream究竟有什麼好的

今天隨便聊聊Java 8 中新出現的流(Stream)。
流是用來批量處理資料集合的。而傳統處理方法,是for或while迴圈、iterate迭代處理。

Java程式設計思想的作者對流的評價很高,他說:“流改變了 Java 程式設計的本質,而且帶來了極大的提升。

那流究竟給我們的程式設計帶來了什麼好處呢?主要有以下幾點:

  1. 從我們最關心的效率上來說,在小資料量的情況下,流式處理是比迴圈和迭代處理慢一點,不過資料量小,對程式的效率基本沒影響;當資料量大時,尤其使用了並行流時,效率是高於傳統批量處理方式的。

  2. 流的編碼優雅和簡潔得多

    1. 它是屬於宣告式程式設計,相對於指令式程式設計而言。就是你要對資料集做什麼,你直接告訴程式,具體的執行過程由程式自己內部完成。比如要求最大值,則使用 max()函式,要求和,使用 sum()函式,至於怎麼max,怎麼sum,不用你管,程式自己默默完成了。這樣編碼就非常簡潔了。而指令式程式設計,需要你把具體的實現過程顯式地寫出來,相對而言非常繁瑣
    2. 它往往和函數語言程式設計方式相結合,讓程式碼更加簡練,非常的賞心悅目。
  3. 沒有儲存
    具體說,就是不儲存源資料內容和所有的中間值到記憶體(當然,也會儲存一小部分需要的中間序列值,但是相對於容納整個序列需要的記憶體是很小的)。這樣如果資料量大,就大大節省了記憶體空間。比如讀取一個檔案內容,並分隔成一個個單詞,然後篩選所有長度大於5的單詞。傳統做法是讀取該檔案的所有行到一個List,然後遍歷每一行,對每一行分隔成一個個單詞,然後篩選出符合條件的單詞,儲存到最終結果List中。
    那麼,流不需要把檔案的所有行儲存到記憶體中,只需要告訴它讀取哪個檔案,還有篩選條件,它就通過一系列計算步驟,直接將最終的單詞儲存到最終的結果List中了。
    再舉個具體的例子,你去菜市場買菜,一種方式是先把菜場的所有菜都搬回家,然後挑選出自己需要的菜裝到菜籃子中,最後把其餘的菜都扔掉;第二種方式是直接在菜場挑選出自己需要的菜裝到籃子中,然後回家。顯然第二種方式更簡單,第二種方式就是流使用的方式。
    也許你會很驚訝,因為現實生活中,沒有哪個二貨用第一種方法,但是對於程式而言,在資料量不是很大的情況下,它有足夠的記憶體來使用方法一,並且也不會很慢。
    所以,這一點也是提高了流的處理效率。

  4. 惰性求值
    流是鏈式計算,往往有多個計算步驟。傳統方式是先計算一步,得到結果,然後再計算下一步,得到下一個結果,以此類推。這樣,每一步都要實際地去計算。而流,它不這樣,它是先檢視一共有多少個計算步驟,是否有短路操作,能否跳過一些計算步驟,最後不得不計算了,才開始計算。
    因為這個特性,通過流可以表示很大的(甚至是無限大的)序列,而不用考慮記憶體是否足夠。比如第一步,建立一個無限大的序列,第二步,用limit(10)函式,提取前面10個序列,一下子從處理無限大的序列,變成只需要處理10個序列值。
    比如過濾、排序、對映、去重等流式操作,都是以這種方式處理的。