Java函數式編程(一)

前言

如果你對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)