函數(shù)式編程及Lamda

函數(shù)式編程

定義

函數(shù)式編程(funcational programming)屬于結(jié)構(gòu)化編程的一種赁还。主要思想是把運算過程盡量寫成一系列嵌套的函數(shù)調(diào)用窗声。

結(jié)構(gòu)化編程
一種編程范型响谓,采用子程序撞蚕、代碼區(qū)塊笛钝、for循環(huán)以及while循環(huán) 等結(jié)構(gòu)來取代傳統(tǒng)的goto艰猬。

函數(shù)式編程關(guān)心數(shù)據(jù)的映射,命令式編程關(guān)心解決問題的步驟斧账。

特點
  1. 函數(shù)是“第一等公民”
    函數(shù)和其他數(shù)據(jù)類型一樣谴返,可以賦值給其他變量,作為其他函數(shù)的傳入?yún)?shù)或返回值其骄。

  2. 只用“表達式”亏镰,不用“語句”
    “expression” 是一個單純的運算過程扯旷,總是有返回值拯爽。“statement”是執(zhí)行某種操作钧忽,沒有返回值毯炮。

  3. 沒有“副作用”
    “副作用”是指函數(shù)內(nèi)部有與外部的互動,產(chǎn)生運算以外的其他結(jié)果耸黑。函數(shù)要保持獨立桃煎,所有功能返回一個新的值,尤其不得修改外部變量的值大刊。

純函數(shù)是這樣一種函數(shù)为迈,即相同的輸入,永遠會得到相同的輸出,而且沒有任何可觀察的副作用葫辐。

  1. 不修改狀態(tài)
    函數(shù)式編程使用參數(shù)保存狀態(tài)搜锰,只返回新的值,不修改系統(tǒng)變量耿战。

  2. 引用透明(Referential transparency)
    函數(shù)的運行不依賴外部變量或“狀態(tài)”蛋叼,只依賴輸入?yún)?shù)。只要參數(shù)相同剂陡,引用函數(shù)返回值總是相同的狈涮。

構(gòu)成
  • 高階函數(shù)(higher-order function)
    能夠接受一個函數(shù)作為參數(shù)的函數(shù)。

  • 函子(Functor)
    函子是函數(shù)式編程里最重要的數(shù)據(jù)類型鸭栖,也是基本的運算單位和功能單位歌馍。
    函子是指具有map方法的容器,包含了值和變形關(guān)系纤泵。map方法將容器里面的每一個值骆姐,映射到另一個容器。即將一個范疇轉(zhuǎn)換成令一個范疇捏题。

構(gòu)成范疇這種數(shù)據(jù)模型的要素:
所有成員是一個集合
變形關(guān)系是函數(shù)

  • 閉包(Closure)
    閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)玻褪,可簡單理解成"定義在一個函數(shù)內(nèi)部的函數(shù)"。當內(nèi)嵌函數(shù)體內(nèi)引用到體外的變量時公荧,將會把定義時涉及到的引用環(huán)境和函數(shù)體打包成一個整體(閉包)返回带射。
    類是有行為的數(shù)據(jù),閉包是有數(shù)據(jù)的行為循狰。
    閉包是由函數(shù)及其相關(guān)的引用環(huán)境組合而成的實體窟社,即閉包=函數(shù)+引用環(huán)境
參考

函數(shù)式編程入門教程
函數(shù)式編程初探
學習Javascript閉包(Closure)

lambda

lambda表達式通常在需要一個函數(shù)绪钥,但是又不想費神去命名一個函數(shù)的場合下使用灿里,也就是指匿名函數(shù)。參考

Lambda表達式的本質(zhì)只是一個"語法糖",由編譯器推斷并幫你轉(zhuǎn)換包裝為常規(guī)的代碼,因此你可以使用更少的代碼來實現(xiàn)同樣的功能程腹。

JAVA中的lambda

Java8之前匣吊,傳遞行為的唯一方法就是通過匿名內(nèi)部類。Java中的lamda不是一個匿名內(nèi)部類的語法糖寸潦。在匿名類中色鸳,this指代的是匿名類本身;而在lambda表達式中见转,this指代的是lambda表達式所在的這個類命雀。

1.lambda表達式
只有那些僅僅包含一個非實例化抽象方法的接口才能使用lambda表達式。Runnable接口就是函數(shù)式接口的一個例子斩箫。

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

Java8默認帶有許多可以直接在代碼中使用的函數(shù)式接口吏砂,它們位于java.util.function包中撵儿。

2.lambda表達式結(jié)構(gòu)
-> 是用來把參數(shù)從函數(shù)體中分離出來的操作符。
在lambda表達式中狐血,我們不需要明確指出參數(shù)類型统倒,javac編譯器會通過上下文自動推斷參數(shù)的類型信息。根據(jù)上下文推斷類型的行為稱為類型推斷氛雪。

3.方法引用
當需要為一個特定方法創(chuàng)建lambda表達式房匆,比如Function<String, Integer> strToLength = String::length;,可以用縮寫符號表示。String是目標引用报亩,::是定界符浴鸿,length是目標引用的方法。該方法可以是靜態(tài)或者實例方法弦追。
參考原文

4.實現(xiàn)機制
采用在Java7中新增的動態(tài)啟用來延遲在運行時的加載策略岳链。當javac編譯代碼時,捕獲代碼中的lambda表達式并生成一個動態(tài)啟用的調(diào)用地址(稱lambda工廠)劲件。當動態(tài)啟用被調(diào)用時掸哑,就會向lambda表達式發(fā)生轉(zhuǎn)換的地方返回一個函數(shù)式接口的實例。

JAVA中的Stream

Stream是Java 8 提供的高效操作集合類(Collection)數(shù)據(jù)的API零远。Stream使用一種類似用SQL語句從數(shù)據(jù)庫查詢數(shù)據(jù)的直觀方式來提供一種對JAVA集合運算和表達的高階抽象苗分。

  1. Collection對比
    Java8運行開發(fā)者使用stream方法基于Collection集合創(chuàng)建一個Stream管道。Stream采用內(nèi)部迭代牵辣。
    CollectionStream處理集合方式的不同:

    Collection與Stream處理集合方式的不同

  2. 懶加載
    Stream不會儲存數(shù)據(jù)摔癣,懶加載(只有在被使用到時才會執(zhí)行計算)。Stream表達式在被末端操作方法調(diào)用之前不會被賦值計算纬向。

  • 過渡操作:從已存在的stream上產(chǎn)生另一個新的stream的函數(shù)择浊,比如filter,map,sorted
  • 末端操作:從stream上產(chǎn)生一個非stream結(jié)果的函數(shù),比如collect(toList()),forEach,count,get

參考原文

感想

在一棵樹上吊死是大多數(shù)非理性死忠的表現(xiàn)逾条。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末琢岩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子师脂,更是在濱河造成了極大的恐慌担孔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件危彩,死亡現(xiàn)場離奇詭異攒磨,居然都是意外死亡泳桦,警方通過查閱死者的電腦和手機汤徽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灸撰,“玉大人谒府,你說我怎么就攤上這事拼坎。” “怎么了完疫?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵泰鸡,是天一觀的道長。 經(jīng)常有香客問我壳鹤,道長盛龄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任芳誓,我火速辦了婚禮余舶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锹淌。我一直安慰自己匿值,他們只是感情好,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布赂摆。 她就那樣靜靜地躺著挟憔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪烟号。 梳的紋絲不亂的頭發(fā)上绊谭,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音汪拥,去河邊找鬼龙誊。 笑死,一個胖子當著我的面吹牛喷楣,可吹牛的內(nèi)容都是我干的趟大。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼铣焊,長吁一口氣:“原來是場噩夢啊……” “哼逊朽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起曲伊,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叽讳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坟募,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岛蚤,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年懈糯,在試婚紗的時候發(fā)現(xiàn)自己被綠了涤妒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡赚哗,死狀恐怖她紫,靈堂內(nèi)的尸體忽然破棺而出硅堆,到底是詐尸還是另有隱情,我是刑警寧澤贿讹,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布渐逃,位于F島的核電站,受9級特大地震影響民褂,放射性物質(zhì)發(fā)生泄漏茄菊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一赊堪、第九天 我趴在偏房一處隱蔽的房頂上張望买羞。 院中可真熱鬧,春花似錦雹食、人聲如沸畜普。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吃挑。三九已至,卻和暖如春街立,著一層夾襖步出監(jiān)牢的瞬間舶衬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工赎离, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逛犹,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓梁剔,卻偏偏與公主長得像虽画,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荣病,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理码撰,服務(wù)發(fā)現(xiàn),斷路器个盆,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 原文鏈接:https://github.com/EasyKotlin 值就是函數(shù)脖岛,函數(shù)就是值。所有函數(shù)都消費函數(shù)颊亮,...
    JackChen1024閱讀 5,978評論 1 17
  • 第一章 為什么要關(guān)心Java 8 使用Stream庫來選擇最佳低級執(zhí)行機制可以避免使用Synchronized(同...
    謝隨安閱讀 1,491評論 0 4
  • Java8 in action 沒有共享的可變數(shù)據(jù)销凑,將方法和函數(shù)即代碼傳遞給其他方法的能力就是我們平常所說的函數(shù)式...
    鐵牛很鐵閱讀 1,233評論 1 2
  • 默默: 今天有些煩躁屎飘,原因有很多饥臂′龇可能是生理期快要到了毁兆,也可能是因為今天得知數(shù)學老師每天要早到,大概7:3...
    掌心的手紋閱讀 178評論 0 0