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