成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入理解Stream之原理剖析

開發 前端
中間操作只會進行操作記錄,只有結束操作才會觸發實際的計算,可以理解為懶加載,這也是Stream在操作大對象迭代計算的時候如此高效的原因之一。

今天我們先來聊聊深入理解Stream之原理剖析。

圖片

Stream操作分類

圖片

Stream中的操作可以分為兩大類:中間操作與結束操作。

中間操作只會進行操作記錄,只有結束操作才會觸發實際的計算,可以理解為懶加載,這也是Stream在操作大對象迭代計算的時候如此高效的原因之一。

中間操作分為有狀態操作與無狀態操作,無狀態是指元素的處理不受之前元素的影響,有狀態是指該操作只有拿到所有元素之后才能繼續下去。這也比較好理解,比如有狀態的distinct()去重方法,你說他能不關心其他值嗎?當然不能,他必須拿到所有元素才知道當前迭代的元素是否被重復。

結束操作可以分為短路與非短路操作,這個應該很好理解,短路是指遇到某些符合條件的元素就可以得到最終結果;而非短路是指必須處理所有元素才能得到最終結果。

之所以要進行如此精細的劃分,是因為底層對每一種情況的處理方式不同。

Stream結構分析

讓我們先簡單看看下面一段代碼:

List<String> list = new ArrayList<>();

// 獲取stream1
Stream<String> stream1 = list.stream();

// stream1通過filter后得到stream2
Stream<String> stream2 = stream1.filter("lige"::equals);

// stream1與stream2是同一個對象嗎?
System.out.println("stream1.equals(stream2) = " + stream1.equals(stream2));
System.out.println("stream1.classTypeName = " + stream1.getClass().getTypeName());
System.out.println("stream2.classTypeName = " + stream2.getClass().getTypeName());

// 結果
// stream1.equals(stream2) = false
// stream1.classTypeName = java.util.stream.ReferencePipeline$Head
// stream1.classTypeName = java.util.stream.ReferencePipeline$2

很明顯,stream1與stream2不是同一個對象,并且他們不是同一個實現類。stream1的實現類為ReferencePipeline$Head,而stream2的實現類為一個匿名內部類,讓我們進步一分析其源碼,所謂源碼之下,無所遁形。

圖片

圖片

圖片

讓我們再看看stream2:

圖片

圖片

圖片

圖片

圖片

圖片

通過分析我們可以發現,stream2的實現類是StatelessOp,所以就形成了這樣一個結構。

圖片

每一次中間操作都會生成一個新的Stream,如果是無狀態操作則實現類是StatelessOp,如果是有狀態操作則實現類是StatefulOp。

讓我們再來看一下他們之間的繼承關系。

圖片

圖片

再聊核心Sink

實際上Stream API內部實現的的本質,就是如何重載Sink的這四個接口方法。

我還是從一個示例開始:

List<String> list = new ArrayList<>();
list.add("zhangsan");
list.add("ligeligeligeligeligeligeligeligeligelige");
list.add("lisilisilisilisilisilisilisilisi");
list.add("wangwu");
list.add("ligejishuligejishuligejishuligejishuligejishuligejishuligejishu");

List<String> resultList = list.stream()
.filter(it -> it.contains("li"))// 1. 只要包含li的數據
.filter(it -> it.contains("lige"))// 2. 只要包含lige的數據
.map(String::toUpperCase)// 3. 對符合的數據作進一步加工,轉換大寫
.map(String::toLowerCase)// 4. 對符合的數據作進一步加工,轉換小寫
.collect(Collectors.toList());

resultList.forEach(System.out::println);

不管是filter方法,還是map方法,還是其他的方法,我們進入到源碼層面,返回了一個StatelessOp對象或StatefulOp對象。

所以便產生了這樣一個結構:

圖片

但是和Sink有什么關系呢?我們再反過來看filter或者map源碼:

圖片

直接返回一個匿名StatelessOp對象,實現opWrapSink方法,opWrapSink方法是傳入一個sink對象,返回另一個sink對象。而新的sink對象擁有傳入sink對象的引用。

但是,這個代碼有什么用?什么時候觸發的呢?

別著急,讓我們從collect(Collectors.toList())方法開始一步一步深入研究。

圖片

圖片

圖片

這里我們需要知道傳入xx方法的終端對象是ReduceOp,并且這個ReduceOp對象在makeSink的時候返回了一個匿名內部類ReducingSink對象。

圖片

圖片

圖片

這里的makeSink我們提到過,返回一個匿名內部類ReducingSink對象。

圖片

先執行warpSink,再執行copyInto。直白一點就是先對Sink進行包裝成鏈式Sink,再遍歷Sink鏈進行copy到結果對象里。這里的兩個步驟都很核心。

先看warpSink:

圖片

首次進入時,this為最后的Stream對象,從尾部向頭部遍歷

每次遍歷時,得到一個新的Stream對象,一般為StatelessOp對象或StatefulOp對象

執行操作對象的opWrapSink方法,這就是匿名實現了。

在每一個opWrapSink實現方法中,傳入了上一個sink,最終得到一個sink鏈表

圖片

最后,返回Sink鏈的頭節點,內部稱之為包裝好的sink,命名wrapped,隨后,準備進行執行begin,forEachRemaining,end方法。

圖片

forEachRemaning最終調用accept方法。

圖片

動畫理解Stream執行流程

? 圖片 ?

責任編輯:武曉燕 來源: 李哥技術
相關推薦

2021-02-17 11:25:33

前端JavaScriptthis

2021-09-10 07:31:54

AndroidAppStartup原理

2020-08-10 18:03:54

Cache存儲器CPU

2024-04-15 00:00:00

技術Attention架構

2024-03-12 00:00:00

Sora技術數據

2022-11-04 09:43:05

Java線程

2021-03-10 10:55:51

SpringJava代碼

2022-09-05 08:39:04

kubernetesk8s

2024-11-01 08:57:07

2021-09-08 06:51:52

AndroidRetrofit原理

2021-10-15 09:19:17

AndroidSharedPrefe分析源碼

2020-11-04 15:35:13

Golang內存程序員

2020-03-17 08:36:22

數據庫存儲Mysql

2019-07-01 13:34:22

vue系統數據

2023-10-13 13:30:00

MySQL鎖機制

2020-03-26 16:40:07

MySQL索引數據庫

2023-09-19 22:47:39

Java內存

2022-09-26 08:01:31

線程LIFO操作方式

2022-01-14 12:28:18

架構OpenFeign遠程

2018-12-27 12:34:42

HadoopHDFS分布式系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产高清在线观看 | 婷婷激情综合 | 亚洲国产精品久久 | cao在线 | 91亚洲精选 | 99色在线| 成人免费视频网站在线观看 | 成人在线视频免费观看 | 久久免费香蕉视频 | 色在线看| 亚洲欧美精品 | 欧美黄 片免费观看 | 亚洲成人综合社区 | 国产午夜视频 | 秋霞电影一区二区 | 久久精品国产亚洲 | 午夜精品福利视频 | 黄在线免费观看 | 视频二区 | 国产精品无码久久久久 | 欧美中文字幕一区二区三区亚洲 | 夜夜艹| 欧亚av在线| 久久av一区二区三区 | 五月婷婷在线播放 | 国产精品国产三级国产aⅴ浪潮 | 国产高清性xxxxxxxx | 国产日韩欧美一区二区 | www久久国产 | 在线观看国产视频 | 精品欧美乱码久久久久久1区2区 | 毛片一级片 | 黄色福利 | 国产亚洲精品精品国产亚洲综合 | 在线色网 | 一区二区三区在线观看视频 | 欧美成年人网站 | av中文字幕在线播放 | 91视频播放| 少妇精品久久久久久久久久 | 四色成人av永久网址 |