這幾年大數據很火,在java中,有一個它的代名詞hadoop,它的編程模型叫作MapReduce,java
什麼是MapReduce呢,想象下有個圖書館,裏面有十排書架,我想統計下有多少書,須要一個個數,若是用更快的方式怎麼作。算法
用MapReduce寫一下這個問題編程
首先定義兩個方法 map reduceapi
map() //對數據執行分批並行操做 reduce() //對操做全部返回值求結果
而後是數書的操做定義兩個方法數據結構
countBook() //數一排書 sum()//求和
那麼此次數書操做可表示爲框架
map(countBook()).reduce(sum())
ok,再進一步,如今咱們有了map,reduce兩個方法,下面能夠進行花式數書了,我想統計下數學書函數式編程
定義方法函數
countMathBook();
你會很快寫出oop
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這樣抽象的方法,或者說函數,咱們更願意稱之爲高階函數,這些抽象的方法能夠爲咱們屏蔽底層的運算細節。
好比怎麼分批數書,咱們不須要考慮怎麼分批數,只要傳入一批怎麼數的函數就行。也不要在乎求和的過程,只要傳入求和的函數。
因此,函數式風格的編程就能夠這麼定義。
咱們能夠看到,函數式編程中,函數不只直接調用,也能夠當成參數被其餘函數調用。
所以,進一步,若是我不只想把函數當參數,還想傳入值,因此再封裝一下,函數和值封裝後是什麼。
沒錯就是這就是對象
所以,這麼看來,函數式跟面向對象的思想其實都是一致的,即對邏輯的抽象與封裝。
回顧下語言的歷程
過程式->函數式->面向對象
近年來大數據的興起,數據的處理每每跟面向對象不要緊,更多的是簡單而大量的數據結構,藉助mapreduce這樣的高階函數處理更加方便,這也是函數式編程又火起來的緣由。
程序只不過是回到了它的原點:
算法+數據結構->函數+高階函數+數據。