我開始使用Java 8時,首先做的就是使用lambda表達式替換匿名類,而實現Runnable接口是匿名類的最好示例。看壹下Java 8之前的runnable實現方法,需要4行代碼,而使用lambda表達式只需要壹行代碼。我們在這裏做了什麽呢?那就是用() -> {}代碼塊替代了整個匿名類。
// Java 8之前:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Before Java8, too much code for too little to do");
}
}).start();
//Java 8方式:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();
輸出:
too much code, for too little to do
Lambda expression rocks !!
這個例子向我們展示了Java 8 lambda表達式的語法。妳可以使用lambda寫出如下代碼:
(params) -> expression
(params) -> statement
(params) -> { statements }
例如,如果妳的方法不對參數進行修改、重寫,只是在控制臺打印點東西的話,那麽可以這樣寫:
() -> System.out.println("Hello Lambda Expressions");
如果妳的方法接收兩個參數,那麽可以寫成如下這樣:
(int even, int odd) -> even + odd
順便提壹句,通常都會把lambda表達式內部變量的名字起得短壹些。這樣能使代碼更簡短,放在同壹行。所以,在上述代碼中,變量名選用a、b或者x、y會比even、odd要好。
例2、使用Java 8 lambda表達式進行事件處理
如果妳用過Swing API編程,妳就會記得怎樣寫事件監聽代碼。這又是壹個舊版本簡單匿名類的經典用例,但現在可以不這樣了。妳可以用lambda表達式寫出更好的事件監聽代碼,如下所示:
// Java 8之前:
JButton show = new JButton("Show");
show.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Event handling without lambda expression is boring");
}
});
// Java 8方式:
show.addActionListener((e) -> {
System.out.println("Light, Camera, Action !! Lambda expressions Rocks");
});
Java開發者經常使用匿名類的另壹個地方是為 Collections.sort() 定制 Comparator。在Java 8中,妳可以用更可讀的lambda表達式換掉醜陋的匿名類。我把這個留做練習,應該不難,可以按照我在使用lambda表達式實現 Runnable 和 ActionListener 的過程中的套路來做。
例3、使用lambda表達式對列表進行叠代