恕我直言你可能真的不會java第5篇:Stream的狀態與並行操作
阿新 • • 發佈:2020-06-23
## 一、回顧Stream管道流操作
![](https://img2020.cnblogs.com/other/1815316/202006/1815316-20200623073226997-2114672235.jpg)
通過前面章節的學習,我們應該明白了Stream管道流的基本操作。我們來回顧一下:
* 源操作:可以將陣列、集合類、行文字檔案轉換成管道流Stream進行資料處理
* 中間操作:對Stream流中的資料進行處理,比如:過濾、資料轉換等等
* 終端操作:作用就是將Stream管道流轉換為其他的資料型別。這部分我們還沒有講,我們後面章節再介紹。
看下面的腦圖,可以有更清晰的理解:
![](https://img2020.cnblogs.com/other/1815316/202006/1815316-20200623073227241-219231530.png)
## 二、中間操作:有狀態與無狀態
其實在程式設計師程式設計中,經常會接觸到“有狀態”,“無狀態”,絕大部分的人都比較蒙。而且在不同的場景下,“狀態”這個詞的含義似乎有所不同。但是“萬變不離其宗”,理解“狀態”這個詞在程式設計領域的含義,筆者教給大家幾個關鍵點:
* 狀態通常代表公用資料,有狀態就是有“公用資料”
* 因為有公用的資料,狀態通常需要額外的儲存。
* 狀態通常被多人、多使用者、多執行緒、多次操作,這就涉及到狀態的管理及變更操作。
是不是更蒙了?舉個例子,你就明白了
* web開發session就是一種狀態,訪問者的多次請求關聯同一個session,這個session需要儲存到記憶體或者redis。多次請求使用同一個公用的session,這個session就是狀態資料。
* vue的vuex的store就是一種狀態,首先它是多元件公用的,其次是不同的元件都可以修改它,最後它需要獨立於元件單獨儲存。所以store就是一種狀態。
回到我們的Stream管道流
* filter與map操作,不需要管道流的前面後面元素相關,所以不需要額外的記錄元素之間的關係。輸入一個元素,獲得一個結果。
* sorted是排序操作、distinct是去重操作。像這種操作都是和別的元素相關的操作,我自己無法完成整體操作。就像班級點名就是無狀態的,喊到你你就答到就可以了。如果是班級同學按大小個排序,那就不是你自己的事了,你得和周圍的同學比一下身高並記住,你記住的這個身高比較結果就是一種“狀態”。所以這種操作就是有狀態操作。
## 三、Limit與Skip管道資料擷取