函數式編程

這幾年大數據很火,在java中,有一個它的代名詞hadoop,它的編程模型叫作MapReducejava

什麼是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這樣抽象的方法,或者說函數,咱們更願意稱之爲高階函數,這些抽象的方法能夠爲咱們屏蔽底層的運算細節。

好比怎麼分批數書,咱們不須要考慮怎麼分批數,只要傳入一批怎麼數的函數就行。也不要在乎求和的過程,只要傳入求和的函數。

因此,函數式風格的編程就能夠這麼定義。

  • 將業務邏輯細化,抽象,封裝成一個個功能函數,並藉助語言自帶的高階函數api,將整個業務流程轉化爲函數之間的相互調用,這就是函數式編程。

咱們能夠看到,函數式編程中,函數不只直接調用,也能夠當成參數被其餘函數調用。
所以,進一步,若是我不只想把函數當參數,還想傳入值,因此再封裝一下,函數和值封裝後是什麼。

  • 函數->行爲
  • 值->屬性

沒錯就是這就是對象

  • 將業務邏輯細化,抽象,封裝成一個個對象,並藉助語言,庫,組件,框架等,將整個業務流程轉化爲對象之間的相互調用,這就是面向對象編程。

所以,這麼看來,函數式跟面向對象的思想其實都是一致的,即對邏輯的抽象與封裝。

原點

回顧下語言的歷程

過程式->函數式->面向對象

近年來大數據的興起,數據的處理每每跟面向對象不要緊,更多的是簡單而大量的數據結構,藉助mapreduce這樣的高階函數處理更加方便,這也是函數式編程又火起來的緣由。

程序只不過是回到了它的原點:

算法+數據結構->函數+高階函數+數據。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息