Java函數式編程(一)
- 2020 年 4 月 3 日
- 筆記
前言
如果你對Lambda表達式感興趣,想知道它怎麼幫助你提升專業技能,那麼,看到這篇文章就對了!我們假設大家還不知道Lambda表達式,以及Java的核心類庫的變化,我們將從「零」開始介紹這些概念、類庫和技術。
Standing on Shoulders of Giants
站在巨人的肩膀上
What?
每個人對函數式編程的理解不盡相同。但其核心是:在思考問題時,使用不可變值和函數,函數對一個值進行處理,映射成另一個值。
Demo
我們都知道Swing是一個與平台無關的Java類庫,用來編寫圖形用戶界面(GUI)。該類庫有一個常見用法:為了響應用戶操作,需要註冊一個事件監聽器。用戶一輸入,監聽器就會執行一些操作,如圖:
button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event){ System.out.println("button clicked"); } });
在這個例子中,我們創建了一個新對象,它實現了ActionListener接口。這個接口只有一個方法actionPerformed,當用戶點擊屏幕上的按鈕時,button就會調用這個方法。在該例中,該方法所執行的只是輸出一條信息,表明按鈕已被點擊。
設計匿名內部類的目的,就是為了方便Java程序員們將代碼作為數據傳遞。不過,匿名內部類還是不夠方便。為了調用一行重要的邏輯代碼,不得不加上4行冗繁的樣板代碼。

儘管如此,樣板代碼並不是唯一的問題:這些代碼還相當難讀,因為它沒有清楚地表達程序員的意圖。( ̄▽ ̄)"
我們不想傳入對象,只想傳入行為
但是,我們卻可以把上述代碼寫成一個Lambda表達式,如圖:
(使用Lambda表達式將行為和按鈕單擊進行關聯)
button.addActionListener(event -> System.out.println("button clicked"));
和傳入一個實現某接口的對象不同,我們傳入了一段代碼塊——一個沒有名字的函數。event時參數名,和上面匿名內部類示例中的是同一個參數。->將參數和Lambda表達式的主體分開,而主體是用戶點擊按鈕時會運行的一些代碼。
和使用匿名內部類的另一處不同在於聲明event參數的方式。使用匿名內部類時需要顯式地聲明參數類型ActionEvent event,而在Lambda表達式中無需指定類型,程序依然可以編譯。這是因為javac根據程序的上下(addActionListen
er 方法的簽名 )在後台推斷出了參數event的類型。這意味着如果參數類型不言而明,則無需顯式指定。以後我們會介紹類型介紹的更多細節。
儘管與之前相比,Lambda表達式中的參數需要的樣板代碼很少,但是Java仍然是一種靜態類型語言。為了增加可讀性並遷就我們的習慣,聲明參數時也可以包括類型信息,而且有時編譯器不一定能根據上下文推斷出參數的類型!
今日小結

• Lambda表達式是一個匿名方法,將行為像數據一樣進行傳遞。
今日名言

• 一種新技術一旦開始流行,你要麼坐上壓路機,要麼成為鋪路石。(Stewart Brand)