Java 8——函數(shù)式數(shù)據(jù)處理(流)

本篇內(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子莱找,更是在濱河造成了極大的恐慌酬姆,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宋距,死亡現(xiàn)場離奇詭異轴踱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谚赎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門淫僻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人壶唤,你說我怎么就攤上這事雳灵。” “怎么了闸盔?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵悯辙,是天一觀的道長。 經(jīng)常有香客問我迎吵,道長躲撰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任击费,我火速辦了婚禮拢蛋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔫巩。我一直安慰自己谆棱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布圆仔。 她就那樣靜靜地躺著垃瞧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坪郭。 梳的紋絲不亂的頭發(fā)上个从,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天,我揣著相機(jī)與錄音歪沃,去河邊找鬼信姓。 笑死,一個胖子當(dāng)著我的面吹牛绸罗,可吹牛的內(nèi)容都是我干的意推。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼珊蟀,長吁一口氣:“原來是場噩夢啊……” “哼菊值!你這毒婦竟也來了外驱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤腻窒,失蹤者是張志新(化名)和其女友劉穎昵宇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體儿子,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓦哎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柔逼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒋譬。...
    茶點(diǎn)故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖愉适,靈堂內(nèi)的尸體忽然破棺而出犯助,到底是詐尸還是另有隱情,我是刑警寧澤维咸,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布剂买,位于F島的核電站,受9級特大地震影響癌蓖,放射性物質(zhì)發(fā)生泄漏瞬哼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一租副、第九天 我趴在偏房一處隱蔽的房頂上張望坐慰。 院中可真熱鬧,春花似錦附井、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至人弓,卻和暖如春沼死,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崔赌。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工意蛀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人健芭。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓县钥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親慈迈。 傳聞我的和親對象是個殘疾皇子若贮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內(nèi)容