學習 Java8 函數式編程 (一)

閑聊

Java 一直以來是使用最廣泛的編程語言之一,有很多人擔心在為她的未來擔心。但隨著 Java8 的橫空出世和即將發布的 Java9 讓 Java 迎來了第二春。Java8 最大的改變是引入了函數式編程,Java9 引入了模塊化編程。函數式和模塊化編程 擁有非常美好的未來,很多優秀的編程語言如 JavaScriptScala 都擁有這些特性。

我們為什么要學習 Java8 的函數式編程?

  • 為了編寫出更加簡單、干凈、易讀的代碼。
  • 為了簡化集合的操作。
  • 為了簡單地使用并行計算提高程序的性能。

什么是函數式編程

函數式編程的核心是:在思考問題時,使用不可變值和函數,函數對一個值進行處理,映射成另一個值。
面向對象編程是對數據進行抽象,而函數式編程是對行為進行抽象。

當看到上面的有點晦澀難懂的概念時,我相信大家和我一樣都是一臉蒙逼。先別急,其實我們都有接觸過函數式編程。可能你們會有疑問,不是 Java8 才引入函數式編程么,我們之前也沒使用過 Java8 。為了消除大家的疑惑,我們先看看清單一中的代碼。

清單一

public class Calculater {

    public static void main(String[] args) {
        final int a = 1, b = 2;
        int result = add(new IIntegerMath() {
            @Override
            public int operation() {
                return a + b;
            }
        });

        System.out.println(result);
    }

    public static int add(IIntegerMath iIntegerMath) {
        return iIntegerMath.operation();
    }

}

interface IIntegerMath {

    int operation();

}

清單一中我創建了一個類 Calculater 和一個接口 IIntegerMath 。在 Calculater 的 main 方法中,我調用了 Calculater 的靜態方法 add 。在調用 add 方法時,我 new 了一個實現 IIntegerMath 接口的匿名內部類對象作為 add 方法的第參數。在匿名內部內中實現了具體的 operation 方法

其實在給 add 方法傳參數時,我們真正需要的是一個行為,也就是 IIntergerMath 接口中的 operaton 方法。這就是函數式編程要做的事,對行為進行抽象。「ps: 在這里我對函數式編程是對行為進行抽象這個概念解釋的還不是很清楚,我相信你們通過具體的代碼會有更加深刻清晰地理解。」

我相信大家有注意到, main 方法中的變量 a 和 b 被定義成了 final 類型的。因為如果在匿名內部類只能調用外部類的 final 變量。在 operation 方法中我們將 a 和 b 映射成了另一個值。在調用 add 方法時,我們在用函數式編程解決問題,我們在 add 方法中傳入了一個方法(函數) operation ,而 operation 將不可變值 a 和 b 映射成了另一個值。

「ps: 我不知道我是否已將函數式編程的概念表達清楚了,如果大家有更好的見解,可以分享出來。」

初識 Lambda 表達式

我相信大家已經發現,我用清單一中的代碼解釋什么是函數式編程顯得非常牽強。因為清單一中的代碼是 Java8 之前的寫法,屬于命令式代碼。何為命令式代碼?我是這么理解的,在寫一段關鍵代碼的同時要附加上很多樣板式代碼,這些樣板式代碼讓真正有價值的部分黯然失色。在清單一中,你們會發現在調用 add 方法式,我們需要的僅僅是 operation 方法中的 return a + b,而其他的代碼顯得特別多余,這些多余的代碼就屬于樣板式代碼。

命令式風格的代碼并不能讓 Java 擁有函數式編程的特性。所以在 Java 8 引入了 Lambda 表達式。在本文中,我只會將清單一中的代碼用 Lambda 表達式(見清單二)再重寫一遍,將兩種風格的代碼呈現出來做一個對比,我會在之后的博客中詳細介紹 Lambda 表達式。

清單二

public class Calculater {

   public static void main(String[] args) {
       int a = 1, b = 2;
       int result = add(() -> a + b);

       System.out.println(result);
   }

   public static int add(IIntegerMath iIntegerMath) {
       return iIntegerMath.operation();
   }

}

interface IIntegerMath {

   int operation();

}

大家看到清單二中的代碼是不是有大吃一驚,我就用一行代碼做了清單一中 n 多行代碼才能完成的事。這就是 Lambda 表達式的神奇之處,清單二中的 Lambda 表達式 () -> a + b 能夠清晰地詮釋函數式編程的核心思想。你們可能還是不理解我為什么要這么說,沒事,我會在之后的博客中和大家一起深入地學習和探索 Lambda 表達式。

彩蛋

我以后會堅持在每篇博客的末尾丟一個彩蛋,這個彩蛋可能是我認為非常好的書或者微信公號等等。

這次我要向大家推薦 stormzhang 。我從大三就開始關注他的公號,我一直在看他的文章。stormzhang 的文章種類很多,包括技術,理財,人生,職場等等。無論你是屬于哪個行業,我相信 stormzhang 的文章都會對你有所益。 stormzhang 目前就職于上海薄荷信息科技有限公司,擔任公司的技術主管。下圖是他的公號的二維碼。

請關注stormzhang的微信公眾號
請關注stormzhang的微信公眾號

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容