一文帶你深入體驗Stream流

2021-10-16 17:19:52 字數 3582 閱讀 3364

相信也有不少的同學想要知道:lambda表示式在工作中哪個場景會用得比較多?跟lambda搭邊的,使用stream流會比較多

public static void main(string args) ;

int sum = 0;

for (int i : nums) 

system.out.println("結果為:" + sum);

}

如果我們使用stream流的話,可以這樣:

public static void main(string args) ;

int sum2 = intstream.of(nums).sum();

system.out.println("結果為:" + sum2);

}

**量上可以明顯看出,用stream流的方式會少一些。

我理解的stream流程式設計就是:某些場景會經常用到操作(求和/去重/過濾….等等),已經封裝好api給你了,你自己別寫了,調我給你提供的api就好了

回到我們最原始的**:

public static void main(string args) ;

int sum = 0;

for (int i : nums) 

system.out.println("結果為:" + sum);

}

如果我們想要for迴圈的內部支援併發的話,顯然不太好去寫。但使用stream流的方式,呼叫乙個方法就可以支援併發(parallel):

public static void main(string args) ;

int sum2 = intstream.of(nums).parallel().sum();

system.out.println("結果為:" + sum2);

}

優點:調api肯定是比自己寫的**量要少。

缺點:不方便除錯

為什麼要使用stream流在我看來就是以上兩個原因:

stream繼承結構圖

使用stream流分為三步:

建立stream流

通過stream流物件執行中間操作

執行最終操作,得到結果

三步走建立流我們最常用的就是從集合中建立出流

/**

* 返回的都是流物件

* @param args

*/public static void main(string args) );

// 建立數字流

intstream intstream = intstream.of(1, 2, 3);

// 使用random建立

intstream limit = new random().ints().limit(10);

}

怎麼理解中間操作?意思是這樣的:在上面我們已經能建立出stream了,我們是對stream進行操作,對stream操作返回完返回的還是stream,那麼我們稱這個操作為中間操作。

中間操作 解釋

比如,我們現在有個字串my name is 007,**如下:

string str = "my name is 007";

stream.of(str.split(" ")).filter(s -> s.length() > 2)

.map(s -> s.length()).foreach(system.out::println);

分解:1、從字串陣列建立出流物件:

streamsplit = stream.of(str.split(" "));
2、通過流物件的api執行中間操作(filter),返回的還是流物件:

streamfilterstream = split.filter(s -> s.length() > 2);
3、通過返回的流物件再執行中間操作(map),返回的還是流物件:

streamintegerstream = filterstream.map(s -> s.length());
因為中間操作返回的都是流物件,所以我們可以鏈式呼叫

注意:stream上的操作並不會立即執行,只有等到使用者真正需要結果的時候才會執行(惰性求值)。

比如說,peek()是乙個中間操作,返回的是stream流物件,只要它不執行最終的操作,這個stream是不會執行的。

string str = "my name is 007";

stream.of(str.split(" ")).peek(system.out::println); // 不會有資訊列印

最終操作返回的不再是stream物件,呼叫了最終操作的方法,stream才會執行。還是以上面的例子為例:

string str = "my name is 007";

stream.of(str.split(" ")).peek(system.out::println).foreach(system.out::println)

這次我們加入了最終操作,所以這次的stream流會被執行,由於中間操作和最終操作都是執行列印,所以會看到兩次列印:

結果圖至於中間操作和最終操作怎麼區分,我們以返回值來看就行了。中間操作返回的是stream例項物件,最終操作返回的不是stream例項物件:

stream介面的方法

使用stream的原因我認為有兩個:

jdk庫提供現有的api,**寫起來簡潔優化

方便併發。大家可以記住乙個結論:在多核情況下,可以使用並行stream api來發揮多核優勢。在單核的情況下,我們自己寫的for效能不比stream api 差多少

一文帶你讀懂「TRIZ」

各位好,本期的內容是 triz與經典triz 在開始之前,請您先嘗試回答以下問題 什麼是triz?什麼是 經典triz 經典triz 包括哪些內容?經典triz 與 現代triz 的區別?您可以先思考一會兒。好了,不知您回答對了幾道題呢?為什麼要學習本課程?學習本課程,你可以獲得哪些知識?在此,我要...

一文帶你搞懂Spring核心

容錯 減少延遲 提高效能 可用性負載均衡 總而言之,其實目的只有乙個,使用者體驗 分布式系統是由使用分發中介軟體連線的自治計算機組成的網路。它們有助於共享不同的資源和功能,為使用者提供單一且整合的連貫網路。1 在伺服器 虛擬機器 上安裝zookeeper 我這裡使用docker安裝 1 去docke...

一文帶你徹底搞懂ThreadLocal

共享變數一直是併發中的老大難問題,每個執行緒都對它有操作權,所以執行緒之間的同步很關鍵,鎖也就應運而生。這裡換乙個思路,是否可以把共享變數私有化?即每個執行緒都擁有乙份共享變數的本地副本,每個執行緒對應乙個副本,同時對共享變數的操作也改為對屬於自己的副本的操作,這樣每個執行緒處理自己的本地變數,形成...