欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、回顧Stream管道流操作

通過(guò)前面章節(jié)的學(xué)習(xí),我們應(yīng)該明白了Stream管道流的基本操作。我們來(lái)回顧一下:

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

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

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

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

  • 狀態(tài)通常代表公用數(shù)據(jù),有狀態(tài)就是有“公用數(shù)據(jù)”
  • 因?yàn)橛泄玫臄?shù)據(jù),狀態(tài)通常需要額外的存儲(chǔ)。
  • 狀態(tài)通常被多人、多用戶、多線程、多次操作,這就涉及到狀態(tài)的管理及變更操作。

是不是更蒙了?舉個(gè)例子,你就明白了

web開(kāi)發(fā)session就是一種狀態(tài),訪問(wèn)者的多次請(qǐng)求關(guān)聯(lián)同一個(gè)session,這個(gè)session需要存儲(chǔ)到內(nèi)存或者redis。多次請(qǐng)求使用同一個(gè)公用的session,這個(gè)session就是狀態(tài)數(shù)據(jù)。

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

回到我們的Stream管道流

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

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

三、Limit與Skip管道數(shù)據(jù)截取

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方法傳入一個(gè)整數(shù)n,用于截取管道中的前n個(gè)元素。經(jīng)過(guò)管道處理之后的數(shù)據(jù)是:[Monkey, Lion]。skip方法與limit方法的使用相反,用于跳過(guò)前n個(gè)元素,截取從n到末尾的元素。經(jīng)過(guò)管道處理之后的數(shù)據(jù)是: [Giraffe, Lemur]

四、Distinct元素去重

我們還可以使用distinct方法對(duì)管道中的元素去重,涉及到去重就一定涉及到元素之間的比較,distinct方法時(shí)調(diào)用Object的equals方法進(jìn)行對(duì)象的比較的,如果你有自己的比較規(guī)則,可以重寫(xiě)equals方法。

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

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

五、Sorted排序

默認(rèn)的情況下,sorted是按照字母的自然順序進(jìn)行排序。如下代碼的排序結(jié)果是:[Giraffe, Lemur, Lion, Monkey],字?jǐn)?shù)按順序G在L前面,L在M前面。第一位無(wú)法區(qū)分順序,就比較第二位字母。

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

排序我們后面還會(huì)給大家詳細(xì)的講一講,所以這里暫時(shí)只做一個(gè)了解。

六、串行、并行與順序

通常情況下,有狀態(tài)和無(wú)狀態(tài)操作不需要我們?nèi)リP(guān)心。除非?:你使用了并行操作。

還是用班級(jí)按身高排隊(duì)為例:班級(jí)有一個(gè)人負(fù)責(zé)排序,這個(gè)排序結(jié)果最后就會(huì)是正確的。那如果有2個(gè)、3個(gè)人負(fù)責(zé)按大小個(gè)排隊(duì)呢?最后可能就亂套了。一個(gè)人只能保證自己排序的人的順序,他無(wú)法保證其他人的排隊(duì)順序。

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

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

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

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

Monkey
Lion
Lemur
Giraffe
Lion

通常情況下,parallel()能夠很好的利用CPU的多核處理器,達(dá)到更好的執(zhí)行效率和性能,建議使用。但是有些特殊的情況下,parallel并不適合:深入了解請(qǐng)看這篇文章: https://blog.oio.de/2016/01/22/parallel-stream-processing-in-java-8-performance-of-sequential-vs-parallel-stream-processing/

該文章中幾個(gè)觀點(diǎn),說(shuō)明并行操作的適用場(chǎng)景:

數(shù)據(jù)源易拆分:從處理性能的角度,parallel()更適合處理ArrayList,而不是LinkedList。因?yàn)锳rrayList從數(shù)據(jù)結(jié)構(gòu)上講是基于數(shù)組的,可以根據(jù)索引很容易的拆分為多個(gè)。

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

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

相關(guān)文章

  • mybatis if test 不為空字符串或null的解決

    mybatis if test 不為空字符串或null的解決

    這篇文章主要介紹了mybatis if test 不為空字符串或null的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 詳解mybatis collection標(biāo)簽一對(duì)多的使用

    詳解mybatis collection標(biāo)簽一對(duì)多的使用

    這篇文章主要介紹了mybatis collection標(biāo)簽一對(duì)多的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java不可不知的泛型使用示例代碼

    Java不可不知的泛型使用示例代碼

    這篇文章主要介紹了Java不可不知的泛型使用,本文通過(guò)實(shí)例代碼給大家介紹了java的泛型的基本使用,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)機(jī)器人行走

    java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)機(jī)器人行走

    這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)機(jī)器人行走,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java中加鎖的方式代碼示例

    Java中加鎖的方式代碼示例

    這篇文章主要給大家介紹了關(guān)于Java中加鎖方式的相關(guān)資料,我們平時(shí)開(kāi)發(fā)的過(guò)程中難免遇到多線程操作共享資源的時(shí)候,這時(shí)候一般可以通過(guò)加鎖的方式保證操作的安全性,需要的朋友可以參考下
    2023-09-09
  • Java實(shí)現(xiàn)五子棋游戲(控制臺(tái)版)

    Java實(shí)現(xiàn)五子棋游戲(控制臺(tái)版)

    這篇文章主要為大家詳細(xì)介紹了Java控制臺(tái)版實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • MyBatis-Plus標(biāo)簽@TableField之fill自動(dòng)填充方式

    MyBatis-Plus標(biāo)簽@TableField之fill自動(dòng)填充方式

    這篇文章主要介紹了MyBatis-Plus標(biāo)簽@TableField之fill自動(dòng)填充方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Spring事務(wù)原理解析

    Spring事務(wù)原理解析

    Spring事務(wù)有可能會(huì)提交,回滾、掛起、恢復(fù),所以Spring事務(wù)提供了一種機(jī)制,可以讓程序員來(lái)監(jiān)聽(tīng)當(dāng)前Spring事務(wù)所處于的狀態(tài),這篇文章主要介紹了Spring底層事務(wù)原理,需要的朋友可以參考下
    2022-12-12
  • MyBatis注解開(kāi)發(fā)-@Insert和@InsertProvider的使用

    MyBatis注解開(kāi)發(fā)-@Insert和@InsertProvider的使用

    這篇文章主要介紹了MyBatis注解開(kāi)發(fā)-@Insert和@InsertProvider的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-07-07
  • Java中轉(zhuǎn)換器設(shè)計(jì)模式深入講解

    Java中轉(zhuǎn)換器設(shè)計(jì)模式深入講解

    這篇文章主要給大家介紹了關(guān)于Java中轉(zhuǎn)換器設(shè)計(jì)模式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論