JDK1.8 Lambda 使用详解(转)
Lambda
Lambda介紹
Lambda 表達式(lambda expression)是一個匿名函數,Lambda表達式基于數學中的λ演算得名,直接對應于其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。
Lambda表達式的結構
一個 Lambda 表達式可以有零個或多個參數
參數的類型既可以明確聲明,也可以根據上下文來推斷。例如:(int a)與(a)效果相同
所有參數需包含在圓括號內,參數之間用逗號相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c)
空圓括號代表參數集為空。例如:() -> 42
當只有一個參數,且其類型可推導時,圓括號()可省略。例如:a -> return a*a
Lambda 表達式的主體可包含零條或多條語句
如果 Lambda 表達式的主體只有一條語句,花括號{}可省略。匿名函數的返回類型與該主體表達式一致
如果 Lambda 表達式的主體包含一條以上語句,則表達式必須包含在花括號{}中(形成代碼塊)。匿名函數的返回類型與代碼塊的返回類型一致,若沒有返回則為空
Lambda 表達式的使用
下面我們先使用一個簡單的例子來看看Lambda的效果吧。
比如我們對Map 的遍歷 傳統方式遍歷如下:
Map<String, String> map = new HashMap<>();
map.put(“a”, “a”);
map.put(“b”, “b”);
map.put(“c”, “c”);
map.put(“d”, “d”);
System.out.println(“map普通方式遍歷:”);
for (String key : map.keySet()) {
System.out.println(“k=” + key + “,v=” + map.get(key));
}
使用Lambda進行遍歷:
System.out.println(“map拉姆達表達式遍歷:”);
map.forEach((k, v) -> {
System.out.println(“k=” + k + “,v=” + v);
});
List也同理,不過List還可以通過雙冒號運算符遍歷:
List list = new ArrayList();
list.add(“a”);
list.add(“bb”);
list.add(“ccc”);
list.add(“dddd”);
System.out.println(“list拉姆達表達式遍歷:”);
list.forEach(v -> {
System.out.println(v);
});
System.out.println(“list雙冒號運算符遍歷:”);
list.forEach(System.out::println);
輸出結果:
map普通方式遍歷:
k=a,v=a
k=b,v=b
k=c,v=c
k=d,v=d
map拉姆達表達式遍歷:
k=a,v=a
k=b,v=b
k=c,v=c
k=d,v=d
list拉姆達表達式遍歷:
a
bb
ccc
dddd
list雙冒號運算符遍歷:
a
bb
ccc
dddd
Lambda除了在for循環遍歷中使用外,它還可以代替匿名的內部類。比如下面這個例子的線程創建:
//使用普通的方式創建
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println(“普通方式創建!”);
}
};
//使用拉姆達方式創建
Runnable r2 = ()-> System.out.println(“拉姆達方式創建!”);
注: 這個例子中使用Lambda表達式的時候,編譯器會自動推斷:根據線程類的構造函數簽名 Runnable r { },將該 Lambda 表達式賦Runnable 接口。
Lambda 表達式與匿名類的區別使用匿名類與 Lambda 表達式的一大區別在于關鍵詞的使用。對于匿名類,關鍵詞 this 解讀為匿名類,而對于 Lambda 表達式,關鍵詞 this 解讀為寫就 Lambda 的外部類。
Lambda表達式使用注意事項
Lambda雖然簡化了代碼的編寫,但同時也減少了可讀性。
總結
以上是生活随笔為你收集整理的JDK1.8 Lambda 使用详解(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JDK1.8 stream详解(转)
- 下一篇: mysql 下载地址及安装教程