<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
通過前面章節的學習,我們應該明白了Stream管道流的基本操作。我們來回顧一下:
看下面的腦圖,可以有更清晰的理解:
其實在程式設計師程式設計中,經常會接觸到“有狀態”,“無狀態”,絕大部分的人都比較蒙。而且在不同的場景下,“狀態”這個詞的含義似乎有所不同。但是“萬變不離其宗”,理解“狀態”這個詞在程式設計領域的含義,筆者教給大家幾個關鍵點:
是不是更蒙了?舉個例子,你就明白了
web開發session就是一種狀態,存取者的多次請求關聯同一個session,這個session需要儲存到記憶體或者redis。多次請求使用同一個公用的session,這個session就是狀態資料。
vue的vuex的store就是一種狀態,首先它是多元件公用的,其次是不同的元件都可以修改它,最後它需要獨立於元件單獨儲存。所以store就是一種狀態。
回到我們的Stream管道流
filter與map操作,不需要管道流的前面後面元素相關,所以不需要額外的記錄元素之間的關係。輸入一個元素,獲得一個結果。
sorted是排序操作、distinct是去重操作。像這種操作都是和別的元素相關的操作,我自己無法完成整體操作。就像班級點名就是無狀態的,喊到你你就答到就可以了。如果是班級同學按大小個排序,那就不是你自己的事了,你得和周圍的同學比一下身高並記住,你記住的這個身高比較結果就是一種“狀態”。所以這種操作就是有狀態操作。
List<String> limitN = Stream.of("Monkey", "Lion", "Giraffe", "Lemur") .limit(2) .collect(Collectors.toList()); List<String> skipN = Stream.of("Monkey", "Lion", "Giraffe", "Lemur") .skip(2) .collect(Collectors.toList());
limt方法傳入一個整數n,用於擷取管道中的前n個元素。經過管道處理之後的資料是:[Monkey, Lion]。skip方法與limit方法的使用相反,用於跳過前n個元素,擷取從n到末尾的元素。經過管道處理之後的資料是: [Giraffe, Lemur]
我們還可以使用distinct方法對管道中的元素去重,涉及到去重就一定涉及到元素之間的比較,distinct方法時呼叫Object的equals方法進行物件的比較的,如果你有自己的比較規則,可以重寫equals方法。
List<String> uniqueAnimals = Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion") .distinct() .collect(Collectors.toList());
上面程式碼去重之後的結果是: ["Monkey", "Lion", "Giraffe", "Lemur"]
預設的情況下,sorted是按照字母的自然順序進行排序。如下程式碼的排序結果是:[Giraffe, Lemur, Lion, Monkey],字數按順序G在L前面,L在M前面。第一位無法區分順序,就比較第二位字母。
List<String> alphabeticOrder = Stream.of("Monkey", "Lion", "Giraffe", "Lemur") .sorted() .collect(Collectors.toList());
排序我們後面還會給大家詳細的講一講,所以這裡暫時只做一個瞭解。
通常情況下,有狀態和無狀態操作不需要我們去關心。除非?:你使用了並行操作。
還是用班級按身高排隊為例:班級有一個人負責排序,這個排序結果最後就會是正確的。那如果有2個、3個人負責按大小個排隊呢?最後可能就亂套了。一個人只能保證自己排序的人的順序,他無法保證其他人的排隊順序。
Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion") .parallel() .forEach(System.out::println);
parallel()函數表示對管道中的元素進行並行處理,而不是序列處理。但是這樣就有可能導致管道流中後面的元素先處理,前面的元素後處理,也就是元素的順序無法保證。
如果資料量比較小的情況下,不太能觀察到,資料量大的話,就能觀察到資料順序是無法保證的。
Monkey
Lion
Lemur
Giraffe
Lion
通常情況下,parallel()能夠很好的利用CPU的多核處理器,達到更好的執行效率和效能,建議使用。但是有些特殊的情況下,parallel並不適合:深入瞭解請看這篇文章: https://blog.oio.de/2016/01/22/parallel-stream-processing-in-java-8-performance-of-sequential-vs-parallel-stream-processing/
該文章中幾個觀點,說明並行操作的適用場景:
資料來源易拆分:從處理效能的角度,parallel()更適合處理ArrayList,而不是LinkedList。因為ArrayList從資料結構上講是基於陣列的,可以根據索引很容易的拆分為多個。
適用於無狀態操作:每個元素的計算都不得依賴或影響任何其他元素的計算,的運算場景。基礎資料來源無變化:從文字檔案裡面邊讀邊處理的場景,不適合parallel()並行處理。parallel()一開始就容量固定的集合,這樣能夠平均的拆分、同步處理。
以上就是java理論基礎Stream管道流狀態與並行操作的詳細內容,更多關於java Stream管道流狀態與並行操作的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45