雖然Java 8 已經出來好一陣子了~ (記得是 2014的三月)
但還是有不少人會詢問什麼是 Lambda,什麼是 匿名類別 Anonymous class
藉著最近專案的機會,分享一下我們對 Lambda的了解,希望能有所幫助。
預計這一系列的文章,會有
- Java 8 Lambda 的崛起
- Java 8 Lambda 的語法
- Java 8 Lambda 跟集合物件的應用
- Java 8 Lambda 跟File I/O的應用
今天就先針對 Java 8 Lambda 的出現,先做個應用的說明 ~
讓我們從一個很常用的例子開始~ 「使用者在畫面上按下按鈕,然後秀出 HelloWorld」
(*這部份機制,可應用在 Java Swing/FX 以及 Android )
以Java Swing 視窗程式為例,在 Lambda出現之前,我們可能的做法有下列幾項 ~
- 寫一個完全獨立的新類別 來實作 ActionListener,然後在JButton呼叫addActionListener時,當成參數傳入。
1234567891011121314151617class MyActionListener implements ActionListener {public void actionPerformed(ActionListener a) {//...}}//=========== 在另外的程式裏產生按鈕 以及 處理事件 ===========public class MyForm {public static void main(String[] args) {//略過產生視窗以及 掛上(attach) 按鈕JButton jb = new JButton();MyActionListener ma = new MyActionListener();jb.addAcctionListener(ma);}}
- 寫一個在main主程式 類別的內部類別(Inner class),然後在也是一樣,在JButton呼叫addActionListener時,當成參數傳入。
12345678910111213public class MyForm {class MyActionListener implements ActionListener {public void actionPerformed(ActionListener a) {// say Hello}}public static void main(String[] args) {//略過產生視窗以及 掛下按鈕JButton jb = new JButton();MyActionListener ma = new MyActionListener();jb.addAcctionListener(ma);//...}
- 使用匿名類別(Anonymous Inner class),在JButton物件呼叫addActionListener 時,當成參數傳入
1 2 3 4 5 6 7 8 9 10 11 |
public class MyForm { public static void main(String[] args) { //略過產生視窗以及 掛上(attach)按鈕 JButton jb = new JButton(); jb.addAcctionListener( new ActionListener() { public void actionPerformed(ActionListener a) { //say Hello } }); } } |
在Java 8 Lambda 出現後,我們可以用下列的寫法
5 |
jb.addAcctionListener( (a) -> System.out.println("Hello")); |
jb.addActionListener( (a)-> System.out.println(“Hello”));
沒錯,就只要寫 一行,就可以有同樣的效果~~~
剩下的,就讓Java 8 Compiler 將程式碼 編譯成跟之前 actionListener 一樣的class code !!!
是不是很方便~~~ 趕快試試看囉~~
對了~
匿名類別 (Anonymous class)還不是很清楚?! 可以參考我們提供的教育訓練。
參考資料:
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
http://www.coreservlets.com/java-8-tutorial/#setup