門
java8出來后,特意了解它的新特性lambda表達式,由此頭一次聽說了函數式編程這個詞,聽起來挺高深的樣子。也曾各種搜索去了解它的來龍去脈。甚至買了一本書《函數式編程思想》,並在部門內進行了一次討論。此時,首先需要回答的問題便是
- 函數式編程:那是什么東西?
為此,我逛過百度,各種博客,知乎,github,但沒有看到一個直接的答案,大多是列舉函數式編程的特性,優點,理解能力有限,在多次思考之后,某一天突然頓悟了。
是什么
首先,舉個栗子:
這幾年大數據很火,在java中,有一個它的代名詞hadoop,它的編程模型叫做MapReduce,
什么是MapReduce呢,想象下有個圖書館,里面有十排書架,我想統計下有多少書,需要一個個數,如果用更快的方式怎么做。
- 找十個人,每人數一排;
- 將每個人的結果求和;
用MapReduce寫一下這個問題
首先定義兩個方法 map reduce
map() //對數據執行分批並行操作
reduce() //對操作所有返回值求結果
然后是數書的操作定義兩個方法
countBook() //數一排書
sum()//求和
那么這次數書操作可表示為
map(countBook()).reduce(sum())
ok,再進一步,現在我們有了map,reduce兩個方法,下面可以進行花式數書了,我想統計下數學書
定義方法
countMathBook();
你會很快寫出
map(countMathBook()).reduce(sum());
但是,我們需要擁抱變化,所以現在需求變了,我想知到十個書架中,書最多的書架的是哪一個
因此方法在此
max() //求最大值
map(countBook()).reduce(max())
然后需求又變了我想知到十個書架中,數學書最多的書架的是哪一個
現在不需要考慮了
map(countMathBook()).reduce(max())
我想要求最小的呢
map(countBook()).reduce(min())
我想要求紅色書的數量呢
map(countRedBook()).reduce(sum())
…
花式數書結束,現在我們可以回答下什么是函數式編程了。
首先map,reduce本身不是這次數書所定義的業務方法,而是語言比如java的jdk自帶的api,java8之后,在原有的函數庫中,新增了許多像map,reduce這樣抽象的方法,或者說函數,我們更願意稱之為高階函數,這些抽象的方法可以為我們屏蔽底層的運算細節。
比如怎么分批數書,我們不需要考慮怎么分批數,只要傳入一批怎么數的函數就行。也不要在意求和的過程,只要傳入求和的函數。
所以,函數式風格的編程就可以這么定義。
- 將業務邏輯細化,抽象,封裝成一個個功能函數,並借助語言自帶的高階函數api,將整個業務流程轉化為函數之間的相互調用,這就是函數式編程。
我們可以看到,函數式編程中,函數不僅直接調用,也可以當成參數被其他函數調用。
因此,進一步,如果我不僅想把函數當參數,還想傳入值,所以再封裝一下,函數和值封裝后是什么。
- 函數->行為
- 值->屬性
沒錯就是這就是對象
- 將業務邏輯細化,抽象,封裝成一個個對象,並借助語言,庫,組件,框架等,將整個業務流程轉化為對象之間的相互調用,這就是面向對象編程。
因此,這么看來,函數式跟面向對象的思想其實都是一致的,即對邏輯的抽象與封裝。
原點
回顧下語言的歷程
過程式->函數式->面向對象
近年來大數據的興起,數據的處理往往跟面向對象沒關系,更多的是簡單而大量的數據結構,借助mapreduce這樣的高階函數處理更加方便,這也是函數式編程又火起來的原因。
程序只不過是回到了它的原點:
算法+數據結構->函數+高階函數+數據。
作者:初龍
原文鏈接:https://chulung.com/article/what-is-functional-programming
本文由MetaCLBlog於2017-07-17 09:02:08自動同步至cnblogs
本文基於 知識共享-署名-非商業性使用-禁止演繹 4.0 國際許可協議發布,轉載必須保留署名及鏈接。