什么是函數式編程


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 國際許可協議發布,轉載必須保留署名及鏈接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM