先上一段代碼
目前創(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é)力一起成長,共同發(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í)很常用的功能, 讓代碼變的更簡潔, 可讀性也更好, 但是完全沒有了解過它內(nèi)部的邏輯. 今天有時(shí)間自己嘗試梳理了一下源碼, 這也算是我第一次獨(dú)立分析源碼, 寫的不好還請見諒.
整體邏輯先在前面總結(jié)一下整套流程的大體邏輯.
在學(xué)習(xí)stream的使用方法時(shí), 就了解到一些流操作分為中間操作
和終止操作
.中間操作
并不會(huì)觸發(fā)邏輯執(zhí)行, 真正觸發(fā)操作執(zhí)行是終止操作
.
一段流操作中的中間操作
在內(nèi)部使用AbstractPipeline
被連接成雙向鏈表
的結(jié)構(gòu), 并使用Sink
保存具體的操作方式(如上面的過濾邏輯).
直到有一個(gè)中間操作對象
調(diào)用了終止操作
.終止操作
需要實(shí)現(xiàn)TerminalOp
和Sink
. 由終止操作
構(gòu)造Sink
調(diào)用單向鏈表. 最終將Sink
執(zhí)行鏈委托給Spliterator
調(diào)用.
重要的類
AbstractPipeline : 雙向鏈表元素類
Sink : 操作鏈, 串聯(lián)整個(gè)流操作中的具體邏輯的類
Spliterator : 真正遍歷調(diào)用操作鏈的類
這里暫時(shí)聽不明白沒關(guān)系, 下面正式進(jìn)入代碼
從第一個(gè)方法開始分析.
這個(gè)方法構(gòu)造了最初的Stream
對象, 第一個(gè)參數(shù)是通過調(diào)用內(nèi)部方法獲取的.先不管這個(gè)參數(shù).
點(diǎn)進(jìn)StreamSupport
提供的方法, 可以發(fā)現(xiàn)這里的Stream
對象的實(shí)際類型是ReferencePipeline
的內(nèi)部類Head
構(gòu)造了雙向鏈表的頭.
注意, 這里filter()其實(shí)是由Head
對象調(diào)用的, 注意搞清楚this
的值.
這里創(chuàng)建了一個(gè)StatelessOp
.
繼續(xù)追溯構(gòu)造方法, 實(shí)際是調(diào)用了AbstractPipeline
的構(gòu)造方法, 此時(shí)構(gòu)造對象的previousStage
就是Head
. 同時(shí)為previousStage
的nextStage
賦值. 這時(shí)候, 雙向鏈表已經(jīng)有了兩個(gè)元素.
這里想象一下第二個(gè)filter運(yùn)行時(shí), 會(huì)將上一個(gè)filter的StatelessOp
對象作為previousStage
, 執(zhí)行相同的操作. 做完這些操作, 雙向鏈表里加入了第三個(gè)元素.
此時(shí)終止操作是由最后一個(gè)中間操作調(diào)用
這里將終止操作的邏輯保存在ForEachOps
對象中
由終止操作
調(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://aaarwkj.com/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)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容