學(xué)習(xí)筆記——JavaStream源碼學(xué)習(xí)-創(chuàng)新互聯(lián)

思路

先上一段代碼

目前創(chuàng)新互聯(lián)建站已為超過千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、郫都網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
ListuserList = new ArrayList<>();

        for (int i = 0; i< 10; i++) {userList.add(new User(i, "wtq", "1234"));
        }
        userList.stream()
                .filter(user ->user.getUserId() >3)
                .filter(user ->user.getUserId() >4)
                .forEach(System.out::println);

Java的stream流, 平時(shí)很常用的功能, 讓代碼變的更簡(jiǎn)潔, 可讀性也更好, 但是完全沒有了解過它內(nèi)部的邏輯. 今天有時(shí)間自己嘗試梳理了一下源碼, 這也算是我第一次獨(dú)立分析源碼, 寫的不好還請(qǐng)見諒.

整體邏輯

先在前面總結(jié)一下整套流程的大體邏輯.
在學(xué)習(xí)stream的使用方法時(shí), 就了解到一些流操作分為中間操作終止操作.中間操作并不會(huì)觸發(fā)邏輯執(zhí)行, 真正觸發(fā)操作執(zhí)行是終止操作.
一段流操作中的中間操作在內(nèi)部使用AbstractPipeline被連接成雙向鏈表的結(jié)構(gòu), 并使用Sink保存具體的操作方式(如上面的過濾邏輯).
直到有一個(gè)中間操作對(duì)象調(diào)用了終止操作.終止操作需要實(shí)現(xiàn)TerminalOpSink. 由終止操作構(gòu)造Sink調(diào)用單向鏈表. 最終將Sink執(zhí)行鏈委托給Spliterator調(diào)用.
重要的類
AbstractPipeline : 雙向鏈表元素類
Sink : 操作鏈, 串聯(lián)整個(gè)流操作中的具體邏輯的類
Spliterator : 真正遍歷調(diào)用操作鏈的類
在這里插入圖片描述
在這里插入圖片描述
這里暫時(shí)聽不明白沒關(guān)系, 下面正式進(jìn)入代碼

讀代碼 stream()

從第一個(gè)方法開始分析.
在這里插入圖片描述
這個(gè)方法構(gòu)造了最初的Stream對(duì)象, 第一個(gè)參數(shù)是通過調(diào)用內(nèi)部方法獲取的.先不管這個(gè)參數(shù).
在這里插入圖片描述
點(diǎn)進(jìn)StreamSupport提供的方法, 可以發(fā)現(xiàn)這里的Stream對(duì)象的實(shí)際類型是ReferencePipeline的內(nèi)部類Head構(gòu)造了雙向鏈表的頭.

filter() 中間操作

注意, 這里filter()其實(shí)是由Head對(duì)象調(diào)用的, 注意搞清楚this的值.
這里創(chuàng)建了一個(gè)StatelessOp.
在這里插入圖片描述
繼續(xù)追溯構(gòu)造方法, 實(shí)際是調(diào)用了AbstractPipeline的構(gòu)造方法, 此時(shí)構(gòu)造對(duì)象的previousStage就是Head. 同時(shí)為previousStagenextStage賦值. 這時(shí)候, 雙向鏈表已經(jīng)有了兩個(gè)元素.
這里想象一下第二個(gè)filter運(yùn)行時(shí), 會(huì)將上一個(gè)filter的StatelessOp對(duì)象作為previousStage, 執(zhí)行相同的操作. 做完這些操作, 雙向鏈表里加入了第三個(gè)元素.
在這里插入圖片描述

foreach() 終止操作

此時(shí)終止操作是由最后一個(gè)中間操作調(diào)用
這里將終止操作的邏輯保存在ForEachOps對(duì)象中
在這里插入圖片描述
在這里插入圖片描述
終止操作調(diào)用最終評(píng)估方法, 將全部中間操作構(gòu)成的鏈表傳入方法
在這里插入圖片描述
繼續(xù)傳遞
在這里插入圖片描述
在這里插入圖片描述構(gòu)造Sink單向鏈表
在這里插入圖片描述
Sink鏈表傳遞給Spliterator
在這里插入圖片描述
為每個(gè)元素調(diào)用Sink操作鏈
在這里插入圖片描述

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站標(biāo)題:學(xué)習(xí)筆記——JavaStream源碼學(xué)習(xí)-創(chuàng)新互聯(lián)
本文來源:http://muchs.cn/article14/dddcge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、Google、云服務(wù)器網(wǎng)站營銷、用戶體驗(yàn)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)