函數式編程思惟在三行代碼情書中的應用

函數式編程概述

現在主流的編程語言,函數式編程範式或多或少都融入其中成了「標配」,或者說主流語言都在進行函數式方面的擴充,這是一個大趨勢。以Java爲例,隨着 Lambda塊 和 Stream API 等這種高階函數的加持,Java總算是裝備了函數式這一利器;博大精深的C++也在2011版的語言標準里加入了Lambda塊的支持;再好比前一段時間我初步體驗了的 Groovy語言,雖然其運行於JVM之上,然而其對 動態語言函數式編程範式 以及 元編程功能 的加持所帶來的表現力和簡潔性能夠說甩了Java幾條街,能夠利用Groovy的全部動態功能構建高性能的JVM應用、將開發效率提升幾個數量級。語言的例子有不少,我不一一枚舉。編程

爲何要使用函數式編程範式

這裏講幾個函數式編程的典型特色,區別的對象那就是傳統的命令式編程編程語言

命令式編程 VS 函數式編程

  • 0x01. 更高層次的抽象(高階函數)

用高階抽象來取代基本的控制結構自己就是一個全新的思考方式,這樣可讓開發者聚焦精力於業務場景而無需費心複雜地層運做函數式編程

舉個栗子:將一個字符串集合中的全部單詞轉爲大寫,咱們用Java語言來實現函數

若是按照傳統的命令式編程的解法,那接下來不出意外咱們得來寫循環、遍歷這種迭代操做了:性能

for (int i=0; i<wordList.size(); i++) {
   wordList.get(i).toUpperCase();
}

但若是使用Java的函數式編程範式,一切都是那麼的優雅,一句話搞定spa

wordList.stream.map( w -> w.toUpperCase() )

這裏的map()函數就是所謂的高階函數,咱們用高階函數代替了底層的迭代,由於咱們並無處理細節,咱們僅僅定義了映射的邏輯,迭代由高階函數來自動完成!code

  • 0x02. 提高代碼信噪比(簡潔性)

區別於面嚮對象語言用抽象來封裝不肯定因素,函數式編程經過儘可能減小不肯定因素來使代碼極度簡潔對象

上面的例子對於本條優勢的展示我想應該也沒必要多說了blog

  • 0x03. 控制權轉交於運行時(動態性)

區別於傳統的編譯形語言,配備函數式編程範式的動態語言更多的將控制權轉交到語言運行時手裏,得到的則是更高的靈活性、表現力和性能權衡。開發

這三點優勢將在接下來的例子中切實的感覺並領會!

函數式編程例析

舉例1:詞頻統計

作的事情很簡單:給定一個單詞集合,統計出集合中除了助詞(如ofonthe等)以外的單詞出現的頻次,不區分大小寫

命令式解法: 至少分爲如下幾大步

  • 先進行循環迭代
  • 而後統一將單詞轉爲小寫
  • 而後判斷單詞是不是助詞
  • 最後進行詞頻統計
相關文章
相關標籤/搜索