自從我聽說Java8將要支持Lambda表達式(或稱閉包),我便開始狂熱的想要將這些體面的簡潔的功能元素應用到我的代碼中來。大多開發者普遍的使用匿名內部類來開發事件處理器,比較器,thread/runnable實現等等,一些沒有必要的輔助代碼將邏輯復雜化,即便一些非常簡單的代碼也變的復雜不堪。Java8現在加入了Lambda表達式作為語法的一部分將會極大地解決這一類似問題。
它使得開發者可以封裝一個單獨的行為單元並且傳遞給其他代碼。他更像是一個匿名類(帶有一個方法的可推斷類型)的語法糖和一個更少對象的方法。我希望這篇文章不會扯過多廣泛的理論材料,但是在理解Lambda的語法,結構和實例前,這裡還是有一個非常重要的概念需要注意。
Java 8 中 HashMap 的性能提升 http://www.linuxidc.com/Linux/2014-04/100868.htm
Java 8 的 Nashorn 引擎 http://www.linuxidc.com/Linux/2014-03/98880.htm
Java 8簡明教程 http://www.linuxidc.com/Linux/2014-03/98754.htm
Source Code
下面是一個IntelliJ的項目,包含了該篇文章中所有例子的源碼。
下載源碼
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2014年資料/5月/16日/Java 8 Lambda 表達式示例
下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm
一個函數式接口 (又或者稱單抽象方法類型或者SMA)是任何包含為一個抽象方法的接口. 但它可能包含一些static或者/和default 方法.java.lang.Runnableis是一個函數式接口的例子, 因為他只有一個run()方法, 並且是抽象的. 類似的 ActionListener也是一個函數式接口. 下面是一個用戶自定義函數式接口的例子。
interface Worker() {
boolean doWork();
};
喊一下另一個典型的函數式接口的例子:
interface Operator {
TYPE operate(TYPE operand1, TYPE operand2);
}
就是這樣, 因為他就是一個含有一個抽象方法的普通接口. 盡管對於函數式接口還有很多需要討論尤其是java8提供的 java.util.function包和@FunctionalInterface注解,但現在僅僅關注lambdas。我會在另一篇單獨的博客中討論那些話題。
Lambda 表達式,也被稱為閉包,是為開發者提供用簡單和緊湊的方式表示數據的匿名函數。
- Brian Goetz, Specification Lead for JSR 335
為了更容易的了解lambda表達式的語法,我們先來看一下常規的匿名內部類。
new Runnable() {
public void run() {
performWork();
}
};
Lambda 表達式為匿名內部類提供了一個更簡潔的實現方法,上面的5行代碼可以被轉換成下面這一行代碼:
() -> performWork();
所以,標准的lambda表達式的語法像下面這樣:
() -> some expression
或者
(arguments) -> { body just like function }
一個 lambda 表達式有以下三部分組成:
// 接受連個整數,並返回它們的和
(int x, int y) -> x + y
// 用一個整數作為參數的lambda表達式,並且返回該整數的下一個整數
(int x) -> { return x + 1; }
在lambda表達式中,你可以省略參數的數據類型。
// 同樣的lambda表達式,但是沒有了數據類型
(x, y) -> x + y
(x) -> { return x + 1; }
此外,如果只有一個參數的話,你甚至可以將括號省略掉
// 只有一個參數的lambda表達式,並且省略掉了括號
x -> { return x + 1; }
//沒有參數,並且返回一個常數92的lambda表達式
() -> 92
// 接受一個字符串作為參數,並且將其輸出在控制台中
(String s) -> { System.out.println(s); }
// 一條語句的body,沒有必要使用花括號包裹或返回語句。
x -> x + 1
// 簡單的lambda表達式,返回值為空
() -> System.out.println(“Hello World!”)
在代碼塊的形式中,body就像一個方法的body那樣被執行,並且返回語句將流程返回到匿名方法的調用處。
好了,我們已經花了些時間來了解lambda表達式的語法,接下來,讓我們來看一些實際的例子吧。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-05/101809p2.htm