最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java理論基礎Stream管道流狀態(tài)與并行操作

 更新時間:2022年03月16日 11:31:45   作者:字母哥哥  
這篇文章主要為大家介紹了java理論基礎Stream管道流狀態(tài)與并行操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

一、回顧Stream管道流操作

通過前面章節(jié)的學習,我們應該明白了Stream管道流的基本操作。我們來回顧一下:

  • 源操作:可以將數組、集合類、行文本文件轉換成管道流Stream進行數據處理
  • 中間操作:對Stream流中的數據進行處理,比如:過濾、數據轉換等等
  • 終端操作:作用就是將Stream管道流轉換為其他的數據類型。這部分我們還沒有講,我們后面章節(jié)再介紹。

看下面的腦圖,可以有更清晰的理解:

二、中間操作:有狀態(tài)與無狀態(tài)

其實在程序員編程中,經常會接觸到“有狀態(tài)”,“無狀態(tài)”,絕大部分的人都比較蒙。而且在不同的場景下,“狀態(tài)”這個詞的含義似乎有所不同。但是“萬變不離其宗”,理解“狀態(tài)”這個詞在編程領域的含義,筆者教給大家?guī)讉€關鍵點:

  • 狀態(tài)通常代表公用數據,有狀態(tài)就是有“公用數據”
  • 因為有公用的數據,狀態(tài)通常需要額外的存儲。
  • 狀態(tài)通常被多人、多用戶、多線程、多次操作,這就涉及到狀態(tài)的管理及變更操作。

是不是更蒙了?舉個例子,你就明白了

web開發(fā)session就是一種狀態(tài),訪問者的多次請求關聯同一個session,這個session需要存儲到內存或者redis。多次請求使用同一個公用的session,這個session就是狀態(tài)數據。

vue的vuex的store就是一種狀態(tài),首先它是多組件公用的,其次是不同的組件都可以修改它,最后它需要獨立于組件單獨存儲。所以store就是一種狀態(tài)。

回到我們的Stream管道流

filter與map操作,不需要管道流的前面后面元素相關,所以不需要額外的記錄元素之間的關系。輸入一個元素,獲得一個結果。

sorted是排序操作、distinct是去重操作。像這種操作都是和別的元素相關的操作,我自己無法完成整體操作。就像班級點名就是無狀態(tài)的,喊到你你就答到就可以了。如果是班級同學按大小個排序,那就不是你自己的事了,你得和周圍的同學比一下身高并記住,你記住的這個身高比較結果就是一種“狀態(tài)”。所以這種操作就是有狀態(tài)操作。

三、Limit與Skip管道數據截取

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方法對管道中的元素去重,涉及到去重就一定涉及到元素之間的比較,distinct方法時調用Object的equals方法進行對象的比較的,如果你有自己的比較規(guī)則,可以重寫equals方法。

List<String> uniqueAnimals = Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion")
        .distinct()
        .collect(Collectors.toList());

上面代碼去重之后的結果是: ["Monkey", "Lion", "Giraffe", "Lemur"]

五、Sorted排序

默認的情況下,sorted是按照字母的自然順序進行排序。如下代碼的排序結果是:[Giraffe, Lemur, Lion, Monkey],字數按順序G在L前面,L在M前面。第一位無法區(qū)分順序,就比較第二位字母。

List<String> alphabeticOrder = Stream.of("Monkey", "Lion", "Giraffe", "Lemur")
        .sorted()
        .collect(Collectors.toList());

排序我們后面還會給大家詳細的講一講,所以這里暫時只做一個了解。

六、串行、并行與順序

通常情況下,有狀態(tài)和無狀態(tài)操作不需要我們去關心。除非?:你使用了并行操作。

還是用班級按身高排隊為例:班級有一個人負責排序,這個排序結果最后就會是正確的。那如果有2個、3個人負責按大小個排隊呢?最后可能就亂套了。一個人只能保證自己排序的人的順序,他無法保證其他人的排隊順序。

  • 串行的好處是可以保證順序,但是通常情況下處理速度慢一些
  • 并行的好處是對于元素的處理速度快一些(通常情況下),但是順序無法保證。這可能會導致進行一些有狀態(tài)操作的時候,最后得到的不是你想要的結果。

Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion")
        .parallel()
        .forEach(System.out::println);

parallel()函數表示對管道中的元素進行并行處理,而不是串行處理。但是這樣就有可能導致管道流中后面的元素先處理,前面的元素后處理,也就是元素的順序無法保證。

如果數據量比較小的情況下,不太能觀察到,數據量大的話,就能觀察到數據順序是無法保證的。

Monkey
Lion
Lemur
Giraffe
Lion

通常情況下,parallel()能夠很好的利用CPU的多核處理器,達到更好的執(zhí)行效率和性能,建議使用。但是有些特殊的情況下,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從數據結構上講是基于數組的,可以根據索引很容易的拆分為多個。

適用于無狀態(tài)操作:每個元素的計算都不得依賴或影響任何其他元素的計算,的運算場景。基礎數據源無變化:從文本文件里面邊讀邊處理的場景,不適合parallel()并行處理。parallel()一開始就容量固定的集合,這樣能夠平均的拆分、同步處理。

以上就是java理論基礎Stream管道流狀態(tài)與并行操作的詳細內容,更多關于java Stream管道流狀態(tài)與并行操作的資料請關注腳本之家其它相關文章!

相關文章

  • java實現數字猜拳小游戲

    java實現數字猜拳小游戲

    這篇文章主要為大家詳細介紹了java實現數字猜拳的小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • SpringBoot幾種常用的接口日期格式化方法

    SpringBoot幾種常用的接口日期格式化方法

    在 Springboot 應用程序中,日期時間格式化處理是非常重要的一方面,本文將總結SpringBoot幾種常用的接口日期格式化方法,通過示例代碼介紹了非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2024-11-11
  • java虛擬機鉤子關閉函數addShutdownHook的操作

    java虛擬機鉤子關閉函數addShutdownHook的操作

    這篇文章主要介紹了java虛擬機鉤子關閉函數addShutdownHook的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Nacos配置中心集群原理及源碼分析

    Nacos配置中心集群原理及源碼分析

    這篇文章主要為大家介紹了Nacos配置中心集群原理及源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-03-03
  • 淺談一個基礎的SpringBoot項目該包含哪些

    淺談一個基礎的SpringBoot項目該包含哪些

    這篇文章主要介紹了淺談一個基礎的SpringBoot項目該包含哪些,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • SpringCloud組件OpenFeign之攔截器解讀

    SpringCloud組件OpenFeign之攔截器解讀

    這篇文章主要介紹了SpringCloud組件OpenFeign之攔截器用法。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Elasticsearch(ES)多種查詢方式案例

    Elasticsearch(ES)多種查詢方式案例

    Elasticsearch是一個分布式的RESTful搜索和分析引擎,可讓您輕松地大規(guī)模存儲,搜索和分析,這篇文章主要給大家介紹了關于Elasticsearch(ES)多種查詢方式的相關資料,需要的朋友可以參考下
    2023-09-09
  • Java集合之LinkedHashSet詳解

    Java集合之LinkedHashSet詳解

    這篇文章主要介紹了Java集合之LinkedHashSet詳解,LinkedHashSet是HashSet的子類,實現了Set接口,LinkedHashSet底層是一個LinkedHashMap,底層維護了一個數組+雙向鏈表,需要的朋友可以參考下
    2023-09-09
  • SpringBoot發(fā)送郵件功能 驗證碼5分鐘過期

    SpringBoot發(fā)送郵件功能 驗證碼5分鐘過期

    這篇文章主要為大家詳細介紹了SpringBoot發(fā)送郵件功能,驗證碼5分鐘過期,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 一文徹底弄懂spring?boot自動配置的過程(推薦)

    一文徹底弄懂spring?boot自動配置的過程(推薦)

    SpringBoot的自動配置機制通過@SpringBootApplication注解作為起點,結合@EnableAutoConfiguration和spring.factories文件,實現了基于類路徑依賴、環(huán)境配置和自定義代碼的智能化配置,感興趣的朋友跟隨小編一起看看吧
    2024-10-10

最新評論

历史| 岳普湖县| 麻栗坡县| 嘉祥县| 博爱县| 靖远县| 准格尔旗| 阜新市| 乐亭县| 太保市| 响水县| 高碑店市| 九龙县| 安义县| 综艺| 通江县| 日土县| 嘉黎县| 宿松县| 景泰县| 霞浦县| 英吉沙县| 大方县| 仙居县| 城固县| 越西县| 武鸣县| 闽清县| 英吉沙县| 晋江市| 大竹县| 吉安市| 若尔盖县| 浮山县| 胶南市| 石屏县| 贵溪市| 祁东县| 望都县| 百色市| 丰镇市|