本篇內(nèi)容大部分來自《Java 8實(shí)戰(zhàn)》
流是什么?
流是Java API
的新成員征懈,它允許你以聲明性方式處理數(shù)據(jù)集合(通過查詢語句來表達(dá)石咬,而不是臨時寫一個實(shí)現(xiàn))。
就現(xiàn)在來說卖哎,你可以把它們看成遍歷數(shù)據(jù)集合的高級迭代器鬼悠。此外,流還可以透明地并行處理亏娜,你無需寫任何多線程代碼焕窝!
下面兩段代碼都是用來返回低熱量的菜肴名稱的,并按照卡路里排序照藻,一個使用java 7
寫的袜啃,另一個是用java 8
的流寫的,比較一下幸缕,不用太關(guān)心java 8的語法:
現(xiàn)在群发,你可以看出晰韵,從軟件工程師的角度來看,新的方法有幾個顯而易見的好處熟妓。
代碼是以聲明性方式寫的:說明想要完成什么(篩選熱量低的菜肴)而不是說明如何實(shí)現(xiàn)一個操作(利用循環(huán)和if條件等控制流語句)雪猪。這種方法加上行為參數(shù)化讓你可以輕松應(yīng)對變化的需求:你很容易創(chuàng)建一個代碼版本,利用Lambda表達(dá)式來篩選高卡路里的菜肴起愈,而用不著去復(fù)制粘貼代碼只恨。
你可以把幾個基礎(chǔ)操作鏈接起來,來表達(dá)復(fù)雜的數(shù)據(jù)處理流水線(在filter后面接上sorted抬虽、map和collect操作)官觅,同時保持代碼清晰可讀。
因?yàn)閒ilter阐污、sorted休涤、map和coleect等操作是與具體線程模型無關(guān)的高層次構(gòu)件,所以它們的內(nèi)部實(shí)現(xiàn)可以是單線程的笛辟,也可能透明地充分利用你的多核架構(gòu)功氨!在實(shí)踐中,這意味著你用不著為了讓某些數(shù)據(jù)處理任務(wù)并行而去操心線程和鎖了手幢,
Steam API
都替你做好了捷凄!
并且新的Steam APi
表達(dá)能力非常強(qiáng),能寫出例如下面這樣的代碼:
Map<Dish.Type, List<Dish>> dishesByType =
menu.steam().collect(groupingBy(Dish::getType));
流簡介
要討論流围来,就要先來討論集合跺涤,這是最容易上手的方式了。Java 8
中的集合支持一個新的stream方法监透,它會返回一個流(接口定義在java.util,steam.Steam
里)钦铁。
那么,流到底是什么呢才漆?簡短的定義就是“從支持?jǐn)?shù)據(jù)處理操作的源牛曹,生成的元素序列”。Oh醇滥,聽上去就讓人頭大黎比。讓我們一步步來剖析這個定義:
讓我們來看一段能夠體現(xiàn)所有這些概念的代碼:
在本例中,我們先是對menu調(diào)用steam方法鸳玩,由菜單得到一個流阅虫。數(shù)據(jù)源是菜肴列表(菜單),它給流提供一個元素序列不跟。接下來颓帝,對流應(yīng)用一系列數(shù)據(jù)處理操作:filter、map、limit和collect购城。
除了collect之外吕座,所有這些操作都會返回另一個流,這樣它們就可以竭誠一條流水線瘪板,于是就可以看作對源的一個查詢吴趴。最后,collect操作開始處理流水線侮攀,并返回結(jié)果锣枝。下圖展示了該流操作的每個操作的簡介:
感覺像不像變魔術(shù)呢?不過至少看起來兰英,是挺酷的撇叁。
集合與流
上圖很好的說明了在Java 8
中的集合與流的關(guān)系,集合就像是DVD一樣畦贸,保存了完整的數(shù)據(jù)結(jié)構(gòu)和所有的值税朴,而流則像是現(xiàn)在視頻網(wǎng)站中的視頻那樣,不必提前下好完整的視頻家制,只需要提前下載好用戶播放位置的那幾幀就好了。
請注意:流和迭代器一樣泡一,都只能遍歷一次颤殴。
流操作
java.util.steam.Steam
中的Steam
接口定義了許多操作。它們可以分為兩大類鼻忠,一類是中間操作
涵但,另一類是終端操作
。
為了方便帖蔓,下面總結(jié)了一些Steam API
提供的操作:
流的使用一般包括三件事:
- 一個數(shù)據(jù)源(如集合)來執(zhí)行一個查詢矮瘟;
- 一個中間操作鏈,形成一條流的流水線塑娇;
- 一個終端操作澈侠,執(zhí)行流水線,并能生成結(jié)果
流的流水線背后的理念有點(diǎn)類似于構(gòu)建器模式埋酬。
至此哨啃,流的基本操作就已經(jīng)闡述完全了,相信你已經(jīng)同我一樣對
Java 8
的新特性感到興奮了吧写妥,不可避免拳球,因?yàn)檫@實(shí)在是太酷啦!
歡迎轉(zhuǎn)載珍特,轉(zhuǎn)載請注明出處祝峻!
簡書ID:@我沒有三顆心臟
github:wmyskxz
歡迎關(guān)注公眾微信號:wmyskxz
分享自己的學(xué)習(xí) & 學(xué)習(xí)資料 & 生活
想要交流的朋友也可以加qq群:3382693