Java8新特性,Stream入門詳解,豐富案例等你細品
JDK8的重要更新除去Lambda之外還有Stream,兩者結合使用為操作和計算數(shù)據(jù)提供了極大的便利。
本篇文章并不打算長篇大論,文章過長會閱讀疲勞,Stream也并不是一兩篇文章可以介紹清楚的,本篇主要介紹Stream的簡單理論加上案例來體會一下Stream的作用,便利和魅力,后續(xù)文章會系統(tǒng)講解Stream體系!
Stream是什么
Stream就是【流】的意思,與 java.io包中的輸入流,輸出流是兩個不同的概念
Stream流是JDK8新增用來處理集合、數(shù)組、文件等數(shù)據(jù),借助Lambda表達式,極大提高編程效率和程序可讀性,同時擁有串行和并行兩種數(shù)據(jù)處理模式,并行模式可以充分利用多核CPU性能,通過 fork/join 方式拆解任務加速處理。
Stream好處
- 函數(shù)式編程:讓Java原本臃腫的代碼變的簡潔,這當然是需要配合Lambda實現(xiàn)
- 高效的并行處理機制,比之前的for循環(huán)加if...else,挨個元素處理速度要快上許多
- 具有多種數(shù)據(jù)的處理實現(xiàn),比如篩選,去重,轉換,查詢,遍歷等內置操作
Stream特點
- 流與集合、數(shù)組、文件不同,不是數(shù)據(jù)結構,不存儲數(shù)據(jù),目的是處理數(shù)據(jù),將處理結果返回或者轉換
- 流在計算數(shù)據(jù)時,如果需要使用到集合中元素,會取出使用,并不修改源數(shù)據(jù),流只使用數(shù)據(jù)一次
- 支持延遲計算,只有等到執(zhí)行終止操作時才會執(zhí)行計算,可以降低不必要的CPU資源浪費
Stream操作分類
- 創(chuàng)建流:可以通過集合、數(shù)組、IO資源、Stream的構造函數(shù)創(chuàng)建
- 中間操作:對數(shù)據(jù)的計算操作,比如篩選,去重,轉換等操作,一個中間操作返回一個新的Stream,來支持連續(xù)計算
- 終止操作:每個流只能有一次終止操作,終止之后流無法使用,會產生一個計算結果,可以根據(jù)需求轉換為想要的結果類型
概念先不說那么多,免得云里霧里,接下來我們直接通過案例來使用Stream對集合的操作
案例:
- 獲取運費大于5000元的運單,并放到新集合中
- 將推薦運單按照運費從高到低排序
- 統(tǒng)計最高運費,最低運費,平均運費
- 將運單按照運費從高到低排序,相同者按照距離從高到低排序
- 將運單按貨物類型分類,將運單按貨物類型和目的地分類,將運單按照運費是否高于5000元分為兩部分
接下來通過傳統(tǒng)方式和Stream兩種分別實現(xiàn),對比不同
提前準備:
1、獲取運費大于5000元的運單,并放到新集合中
運行結果:
解釋:
- filter():方法就是中間操作,意為過濾符合條件的數(shù)據(jù),但是這個數(shù)據(jù)你還不使用,就先不執(zhí)行
- collect():方法是終結操作,意為要將Stream的計算結果轉換為一個List集合,Stream認為你要用計算結果了,所以會執(zhí)行計算,之后保存結果到新的集合中
- 計算過程Stream中是不存儲數(shù)據(jù)的,沒有獲取數(shù)據(jù)的方法
2、將推薦運單按照運費從高到低排序
運行結果:
3、統(tǒng)計最高運費,最低運費,平均運費
運行截圖:
4、將運單按貨物類型分類,將運單按貨物類型和目的地分類,將運單按照運費是否高于5000元分為兩部分
運行截圖:
總結
- Stream的概念、好處、特點和操作分類
- Stream操作集合案例,體會便利之處
- 案例自己寫幾遍,再觀察自己的項目中哪里可以使用Stream替換