函數(shù)式編程

一葵孤、什么是函數(shù)式編程

? ? 函數(shù)式編程是一種編程范式鼻由,以函數(shù)作為第一對象暇榴。注重描述而非具體執(zhí)行步驟(比如SQL只聲明需要什么數(shù)據(jù)厚棵,具體數(shù)據(jù)庫怎么查沒指定)

二、特性

高階函數(shù)是指將一個或多個函數(shù)裝入一個另一個函數(shù)中蔼紧,這個函數(shù)會有相關(guān)操作并且返回一個全新的函數(shù)

三婆硬、應(yīng)用場景

比如創(chuàng)建線程只關(guān)心run()方法,但是JAVA8之前還是需要new Thread()和new Runnable()


四奸例、Lambda表達式

方法最重要的是方法簽名彬犯,那么可以有一個表達式——方法1 = (參數(shù),返回值) {干什么}查吊,Lambda表達式就是將返回值隱去之后得出的一個函數(shù)式

思考:a -> b -> c -> "d" 代表什么?

a的返回值是一個函數(shù)(b -> c -> ?"d"?)

b的返回值還是一個函數(shù)(?c ->??"d")

最后就是一個lambda表達式?c ->??"d"

它的意思是將a的入?yún)鬟f給b函數(shù)谐区,b函數(shù)將a入?yún)⒃賯鹘oc,c函數(shù)傳入入?yún)?zhí)行"d"操作返回最終結(jié)果值

輸入Integer返回一個Function<Integer逻卖,String>宋列,再將x+Integer作為String類型返回,比如傳入1评也,返回x1

4.1)引入lambda表達式后帶來的問題

4.2)函數(shù)式接口 SAM(Single Abstract Method)

4.3)內(nèi)置常用函數(shù)式接口

Supplier相當(dāng)于構(gòu)造函數(shù)只有返回沒有參數(shù)炼杖,Consumer有點像js中onClick(evt)方法只需要一個事件作為參數(shù)而不需要返回,Predicate用于if語句盗迟,UnaryOperator(高階函數(shù))指傳入一個函數(shù)返回一個新的函數(shù)
自定義三個參數(shù)一個返回值的函數(shù)式接口

4.4)函數(shù)的調(diào)用

可連續(xù)調(diào)用指第一個apply()方法返回的是一個Function<>坤邪,第二個apply()方法返回的是一個Consumer<>,第三個accept()方法返回的是一個Supplier<>

ff(String){

}

ff只是方法簽名中的方法名罚缕,既不是一種類型艇纺,也不是一個表達式

所以Function f = ff?這種編寫方式不可以怕磨,那如何將方法名ff進行使用呢

JAVA8提供了方法引用

4.5)方法引用????

指定實例方法
指定類型任意實例方法引用——?比較特殊且難懂

五喂饥、函數(shù)接口轉(zhuǎn)換

特性中的高階函數(shù)
定義轉(zhuǎn)換的代碼編寫
轉(zhuǎn)換后使用的代碼編寫

六、CPS (continuation-passing style)

正常同步方法:

result1 = f1(String a); //方法f1執(zhí)行返回結(jié)果result1

void f2(result1); //方法f2傳入result1繼續(xù)下一步邏輯...

CPS常見的就是callback方法:

void f1(String a, Consumer<Object> callback); //f1()方法沒有返回值肠鲫,但是傳入?yún)?shù)a執(zhí)行后返回的結(jié)果會繼續(xù)傳遞給Object執(zhí)行下一個函數(shù)callback

先加后乘

七员帮、Stream

7.1)概述

流既然可以是無限的,那在操作StreamB變成StreamA的時候不代表系統(tǒng)已經(jīng)完全將StreamB中的元素按照我們lambda表達式的規(guī)則轉(zhuǎn)換好了放到StreamA中导饲,完全可能延遲處理
Source指獲得Stream實例捞高;Intermediate是對Stream所做的操作,可以有多個不同操作組裝最重要是filter和map/flatMAP渣锦;Terminal是獲得結(jié)果的操作
reduce是折疊操作

7.2)理解Stream.reduce()

每次累計完之后acc會更新
理論上reduce可以替代一切for循環(huán)

7.3)reduce實戰(zhàn)? ??

求和
將當(dāng)前對比的最大值作為累計值傳給下一個元素進行對比
在map映射中已經(jīng)將Integer轉(zhuǎn)換成了String
分段式處理具體操作在第二個入?yún)⒅羞M行描述
多個線程分段處理完后進行一個累計值操作(累計也看作reduce)就叫combiner
用reduce實現(xiàn)map
用reduce實現(xiàn)filter
toListAccumulator()方法返回的就是一個高階函數(shù)

函數(shù)式編程的好處硝岗,比如方法不想拋異常:

f1 throw SQLException();

f1WithoutThrowExce(){

? ? try{

? ? ? ? f1();? ??

? ? }

}

假如來了一個f2,需要重新寫一個 f2WithoutThrowExce()袋毙;有了函數(shù)式編程之后可無限復(fù)用

fnWithoutThrowExce(Function<T, R> fn){

? ? return arg -> {

????????try{

? ? ????? ? fn.apply(arg);

? ? ????}

? ? }

}

7.4)理解Stream.collect()

reduce不應(yīng)該用來做toList()操作
第一種
第二個參數(shù)使用了 指定類型任意實例方法引用的少一個參數(shù)的特性型檀,將第一個入?yún)⑿陆ǖ腁rrayList進行了使用;第三個參數(shù)如下圖將分段的所有Container折疊成一個
可分段處理可不分段處理
第二種

Collector接口

Collector接口可以將本接口的四個函數(shù)組裝在一起

Collectors工具類

toList
groupBy

7.5)collect實戰(zhàn)

collectingAndThen()方法是先聚集然后進行下一步操作

八听盖、進階

8.1)函數(shù)組合

8.2)Optional

最重要的功能胀溺,Optional可以安全的一直map()下去裂七,而不用擔(dān)心變成空盒子的問題
通過一個Person對象獲得借記卡銀行名字的操作

8.3)flatMap()

盒子中嵌套了盒子,使用flatMap()
扁平一層就是flatmap仓坞,Stream也有flatMap()處理Stream<Stream>

8.4)Functor & Monad

IO feichen函數(shù)是啥背零?
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市无埃,隨后出現(xiàn)的幾起案子徙瓶,更是在濱河造成了極大的恐慌,老刑警劉巖嫉称,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侦镇,死亡現(xiàn)場離奇詭異,居然都是意外死亡澎埠,警方通過查閱死者的電腦和手機虽缕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒲稳,“玉大人,你說我怎么就攤上這事伍派〗” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵诉植,是天一觀的道長祥国。 經(jīng)常有香客問我,道長晾腔,這世上最難降的妖魔是什么舌稀? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮灼擂,結(jié)果婚禮上壁查,老公的妹妹穿的比我還像新娘。我一直安慰自己剔应,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柱徙,像睡著了一般澎粟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纤控,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天挂捻,我揣著相機與錄音,去河邊找鬼船万。 笑死刻撒,一個胖子當(dāng)著我的面吹牛惜辑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疫赎,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼盛撑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捧搞?” 一聲冷哼從身側(cè)響起抵卫,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胎撇,沒想到半個月后介粘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡晚树,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年姻采,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爵憎。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡慨亲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宝鼓,到底是詐尸還是另有隱情刑棵,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布愚铡,位于F島的核電站蛉签,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏沥寥。R本人自食惡果不足惜碍舍,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望邑雅。 院中可真熱鬧片橡,春花似錦、人聲如沸蒂阱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽录煤。三九已至鳄厌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妈踊,已是汗流浹背了嚎。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人歪泳。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓萝勤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親呐伞。 傳聞我的和親對象是個殘疾皇子敌卓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

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