Java函數(shù)式編程

一集峦、概述

????面向?qū)ο笏枷腙P(guān)注用什么對象完成什么事情。而函數(shù)式編程思想就類似數(shù)學(xué)中的函數(shù)抠刺。它關(guān)注的是對數(shù)據(jù)進(jìn)行了說明操作塔淤。(類似把具體的操作代碼通過參數(shù)的形式傳遞進(jìn)去)

????1、代碼簡潔速妖、接近自然語言高蜂;

????2、越來越多的非關(guān)系型數(shù)據(jù)庫應(yīng)用罕容,大數(shù)據(jù)量下處理集合十分高效方便备恤;

????3、易于并發(fā)編程锦秒;

二露泊、Lambda表達(dá)式

????jdk8的其中一個語法,函數(shù)式思想的一個重要體現(xiàn)旅择,核心原則:可推導(dǎo)可省略

????1惭笑、如果匿名內(nèi)部類是一個結(jié)果,并且只有一個抽象方法需要實(shí)現(xiàn),(例如起一個Thread)則可以修改為lambda表達(dá)式沉噩;

????2捺宗、只關(guān)注參數(shù)和函數(shù)體,idea可以使用alt+回車可以幫助智能轉(zhuǎn)換成lambda表達(dá)式

????3川蒙、省略規(guī)則

????????參數(shù)類型可以省略

????????方法體中只有一句代碼時(shí)大括號return和唯一一句代碼的分號可以省略

????????方法只有一個參數(shù)時(shí)小括號可以省略

三蚜厉、Stream流

????????對集合或數(shù)組進(jìn)行操作,不會影響原數(shù)據(jù)(我們在流中可以處理很多數(shù)據(jù)派歌,但是正常情況下是不會影響到原來集合中的元素的弯囊。

????????流代碼分為三步:

????????1、創(chuàng)建流

????????2胶果、中間操作

? ??????????filter map distinct sorted limit skip flatmap

????????????map()方法中的第一個泛型不能改(第一個類型就是對象的元素,已經(jīng)是定義好的,不能修改不然會報(bào)錯),但是第二個泛型是可以修改的(可以修改為想要的數(shù)據(jù)類型),簡單理解為就是把流當(dāng)中的元素轉(zhuǎn)換為另外一種元素類型然后再放到流中。

???????? ????mapToInt() 高級用法.....還有mapTOLong()等等斤斧,針對基本數(shù)據(jù)類型進(jìn)行優(yōu)化早抠。

????????????流中的distinct()是依賴Object中的equals方法來判斷是否為相同對象的。所以使用distinct方法需要重寫equals方法;

???????? ????limit()用法(截取*個元素)

????????????skip()用法(跳過第*個元素)

????????????流中的sorted()是需要對象去實(shí)現(xiàn)是Comparable接口,不然會拋出ClassCastException異常撬讽。實(shí)現(xiàn)有兩種方式蕊连,一種是在操作的對象中實(shí)現(xiàn),第二種是通過匿名內(nèi)部類的方式去實(shí)現(xiàn)游昼。

????????????flatMap()可以把一個對象轉(zhuǎn)換為多個對象放到流中甘苍。

????????3、終結(jié)操作

????????????流必須要要有終結(jié)操作,否則無法執(zhí)行烘豌。流被終結(jié)以后無法再次使用载庭。

? ? ? ? ? ? forEach()對流中的元素進(jìn)行遍歷操作。

? ? ? ? ? ? count()返回此流中元素的計(jì)數(shù)廊佩。

? ? ? ? ? ? max() min() 獲取流中的最值囚聚。

???????????collect() 是將流中的元素轉(zhuǎn)為一個集合。

? ? ? ? ? ?anyMatch() 根據(jù)邏輯判斷返回布爾值标锄。

? ? ? ? ? ?allMatch() 可以用來判斷是否都符合邏輯判斷條件顽铸,返回布爾值。

? ? ? ? ? ?noneMatch() 可以用來判斷是否都盧符合邏輯判斷條件料皇,返回布爾值谓松。

? ? ? ? ? ?findAny() 查找流中的任意一元素該方法無法保證獲取的元素一定是流中的第一個元素。

? ? ? ? ? ?ifPresent() 如果Optional對象不為null則繼續(xù)往下執(zhí)行践剂。為null就不繼續(xù)往下執(zhí)行鬼譬。

? ? ? ? ? ?findFirst()獲取流中的第一個元素。

? ? ? ? ? ?reduce()舷手,歸并拧簸,即把sream中的元素組合起來計(jì)算出一個結(jié)果。傳入一個參數(shù),循環(huán)流中元素進(jìn)行操作(可以對傳入的參數(shù)進(jìn)行比較等操作),并返回一個傳入?yún)?shù)類型的數(shù)據(jù)男窟。

? ? ? ? ? reduce兩個參數(shù)的重載形式內(nèi)部的計(jì)算方式如下:

? ? ? ? ? T result = identity;

? ? ? ? ? for(T element : this stream){

????????????result = accumlator.apply(result,element);

? ? ? ? ? }

? ? ? ? ? return result;

四盆赤、Optional

????????養(yǎng)成使用Optional的習(xí)慣可以寫出更加優(yōu)雅的代碼來避免空指針異常贾富。

????????實(shí)際開發(fā)過程中很多數(shù)據(jù)是通過數(shù)據(jù)庫來獲取的,Mybatis從3.5版本以后也支持Optional了牺六〔梗可以直接把dao方法的返回值類型定義為Optional類型,Mybatis會自己把數(shù)據(jù)封裝為Optional對象返回淑际。封裝的過程也不需要我們自己去操作畏纲。

????????很多函數(shù)式編程相關(guān)的API都用了Optional。

????????Optional.ofNullable() 將對象封裝為Optional對象春缕。無論傳入的參數(shù)是否為null都不會出現(xiàn)問題盗胀。(建議使用 )

????????Optional.of() 傳入的參數(shù)必須不能為null。(不建議使用)

????????Optional.empty() 返回一個空的Optional對象锄贼。

????????Optional.ifPresent() 該方法會判斷其內(nèi)部封裝的數(shù)據(jù)是否為空,不為空的時(shí)候才能執(zhí)行具體的消費(fèi)代碼票灰。

????????Optional.isPresent()? 該方法會判斷其內(nèi)部封裝的數(shù)據(jù)是否為空,為空返回false,不為空返回true.

????????Optional.filter()? 在方法中進(jìn)行邏輯判斷,如果滿足會返回Optional對象;不滿足則返回null.

????????Optional.map() 將對象中的值轉(zhuǎn)為Optional<List<T>>對象.

????????如果想要安全的獲取Optional對象中的值宅荤,不推薦使用get()方法屑迂。推薦使用以下幾種方法。

????????Optional.orElseGet() 如果Optional中的值為null,可以自定義返回一個對象冯键。

????????Optional.orElseThrow()? 如果Optional中的值為null,可以手動拋出異常惹盼。

五、函數(shù)式接口

????????**JDK的函數(shù)式接口中都加上了@FunctionalInterface注解進(jìn)行標(biāo)識惫确,無論是否加上該注解只要接口中只有一個抽象方法手报,都是函數(shù)式接口。**

????????**JDK自帶的常用函數(shù)式接口**

????????????Comparator 消費(fèi)接口

????????????Function 計(jì)算轉(zhuǎn)換接口

????????????Predicate 判斷接口

????????????Supplier 生產(chǎn)型接口

????????????**方法引用**

????????????類名或?qū)ο竺?:方法名

????????????寫完Lambda表達(dá)式以后雕薪,發(fā)現(xiàn)方法體只有一行代碼昧诱,并且這行代碼調(diào)用了某個對象的成員方法方法所有參數(shù)都按照順序傳入所袁,這時(shí)候就可以引用對象的實(shí)例方法盏档,方法調(diào)用時(shí)候使用Idea快捷鍵能夠轉(zhuǎn)換成方法引用即可。

六燥爷、高級玩法

????????map()方法中的第一個泛型不能改(第一個類型就是對象的元素,已經(jīng)是定義好的,不能修改不然會報(bào)錯),但是第二個泛型是可以修改的(可以修改為想要的數(shù)據(jù)類型),簡單理解為就是把流當(dāng)中的元素轉(zhuǎn)換為另外一種元素類型然后再放到流中蜈亩。

????????mapToInt() 高級用法.....還有mapTOLong()等等,針對基本數(shù)據(jù)類型進(jìn)行優(yōu)化前翎。

七稚配、并行流

????????**當(dāng)流中有大量元素,可以使用并行流提高操作效率。其實(shí)并行流就是把任務(wù)分配給多個線程去完成港华。如果使用Stream的話,只需要修改一個方法的調(diào)用就可以使用并行流來提高效率**

????????Stream.parallel()方法

????????parallelStream() 直接獲取并行流

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末道川,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冒萄,老刑警劉巖臊岸,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尊流,居然都是意外死亡帅戒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門崖技,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逻住,“玉大人,你說我怎么就攤上這事迎献∠狗茫” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵忿晕,是天一觀的道長装诡。 經(jīng)常有香客問我,道長践盼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任宾巍,我火速辦了婚禮咕幻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘顶霞。我一直安慰自己肄程,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布选浑。 她就那樣靜靜地躺著蓝厌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪古徒。 梳的紋絲不亂的頭發(fā)上拓提,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音隧膘,去河邊找鬼代态。 笑死,一個胖子當(dāng)著我的面吹牛疹吃,可吹牛的內(nèi)容都是我干的蹦疑。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼萨驶,長吁一口氣:“原來是場噩夢啊……” “哼歉摧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤叁温,失蹤者是張志新(化名)和其女友劉穎再悼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體券盅,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帮哈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锰镀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娘侍。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泳炉,靈堂內(nèi)的尸體忽然破棺而出憾筏,到底是詐尸還是另有隱情,我是刑警寧澤花鹅,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布氧腰,位于F島的核電站,受9級特大地震影響刨肃,放射性物質(zhì)發(fā)生泄漏古拴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一真友、第九天 我趴在偏房一處隱蔽的房頂上張望黄痪。 院中可真熱鬧,春花似錦盔然、人聲如沸桅打。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挺尾。三九已至,卻和暖如春站绪,著一層夾襖步出監(jiān)牢的瞬間遭铺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工崇众, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掂僵,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓顷歌,卻偏偏與公主長得像锰蓬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子眯漩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

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