- 首頁|
- 網(wǎng)校|
- 焚題庫|
- APP |
-
微信公眾號(hào)
Lambda 表達(dá)式(Lambda expression)是一個(gè)匿名函數(shù),基于數(shù)學(xué)中的λ演算得名,也可稱為閉包(Closure),F(xiàn)在很多語言都支持 Lambda 表達(dá)式,如 C++、C#、Java、 Python 和 JavaScript 等。
Lambda 表達(dá)式是推動(dòng) Java 8 發(fā)布的重要新特性,它允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中),下面通過例 1 來理解 Lambda 表達(dá)式的概念。
例 1
先定義一個(gè)計(jì)算數(shù)值的接口,代碼如下。
// 可計(jì)算接口
public interface Calculable {
// 計(jì)算兩個(gè)int數(shù)值
int calculateInt(int a, int b);
}
Calculable 接口只有一個(gè)方法 calculateInt,參數(shù)是兩個(gè) int 類型,返回值也是 int 類型。實(shí)現(xiàn)方法代碼如下:
public class Test{
/**
* 通過操作符,進(jìn)行計(jì)算
*
* @param opr 操作符
* @return 實(shí)現(xiàn)Calculable接口對象
*/
public static Calculable calculate(char opr) {
Calculable result;
if (opr == '+') {
// 匿名內(nèi)部類實(shí)現(xiàn)Calculable接口
result = new Calculable() {
// 實(shí)現(xiàn)加法運(yùn)算
@Override
填寫下面表單即可預(yù)約申請免費(fèi)試聽java課程!害怕學(xué)不會(huì)?助教陪讀,隨時(shí)解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可全國推薦就業(yè)!
public int calculateInt(int a, int b) {
return a + b;
}
};
} else {
// 匿名內(nèi)部類實(shí)現(xiàn)Calculable接口
result = new Calculable() {
// 實(shí)現(xiàn)減法運(yùn)算
@Override
public int calculateInt(int a, int b) {
return a - b;
}
};
}
return result;
}
}
方法 calculate 中 opr 參數(shù)是運(yùn)算符,返回值是實(shí)現(xiàn) Calculable 接口對象。代碼第 13 行和第 23 行都采用匿名內(nèi)部類實(shí)現(xiàn) Calculable 接口。代碼第 16 行實(shí)現(xiàn)加法運(yùn)算。代碼第 26 行實(shí)現(xiàn)減法運(yùn)算。
public static void main(String[] args) {
int n1 = 10;
int n2 = 5;
// 實(shí)現(xiàn)加法計(jì)算Calculable對象
Calculable f1 = calculate('+');
// 實(shí)現(xiàn)減法計(jì)算Calculable對象
Calculable f2 = calculate('-');
// 調(diào)用calculateInt方法進(jìn)行加法計(jì)算
System.out.println(n1 + "+" + n2 + "=" + f1.calculateInt(n1, n2));
// System.out.printf("%d + %d = %d \n", n1, n2, f1.calculateInt(n1, n2));
// 調(diào)用calculateInt方法進(jìn)行減法計(jì)算
System.out.println(n1 + "-" + n2 + "=" + f1.calculateInt(n1, n2));
// System.out.printf("%d - %d = %d \n", n1, n2, f2.calculateInt(n1, n2));
}
代碼第 5 行中 f1 是實(shí)現(xiàn)加法計(jì)算 Calculable 對象,代碼第 7 行中 f2 是實(shí)現(xiàn)減法計(jì)算 Calculable 對象。代碼第 9 行和第 12 行才進(jìn)行方法調(diào)用。
上述代碼中列出了兩種輸出方式,下面簡單介紹一下 Java 中常見的輸出函數(shù):
printf 主要繼承了C語言中 printf 的一些特性,可以進(jìn)行格式化輸出。
print 就是一般的標(biāo)準(zhǔn)輸出,但是不換行。
println 和 print 基本沒什么差別,就是最后會(huì)換行。
輸出結(jié)果如下:
10+5=15
10-5=15
例 1 使用匿名內(nèi)部類的方法 calculate 代碼很臃腫,Java 8 采用 Lambda 表達(dá)式可以替代匿名內(nèi)部類。修改之后的通用方法 calculate 代碼如下:
/**
* 通過操作符,進(jìn)行計(jì)算
* @param opr 操作符
* @return 實(shí)現(xiàn)Calculable接口對象
*/
public static Calculable calculate(char opr) {
Calculable result;
if (opr == '+') {
// Lambda表達(dá)式實(shí)現(xiàn)Calculable接口
result = (int a, int b) -> {
return a + b;
};
} else {
// Lambda表達(dá)式實(shí)現(xiàn)Calculable接口
result = (int a, int b) -> {
return a - b;
};
}
return result;
}
代碼第 10 行和第 15 行用 Lambda 表達(dá)式替代匿名內(nèi)部類,可見代碼變得簡潔。通過以上示例我們發(fā)現(xiàn),Lambda 表達(dá)式是一個(gè)匿名函數(shù)(方法)代碼塊,可以作為表達(dá)式、方法參數(shù)和方法返回值。
Lambda 表達(dá)式標(biāo)準(zhǔn)語法形式如下:
(參數(shù)列表) -> {
// Lambda表達(dá)式體
}
->被稱為箭頭操作符或 Lambda 操作符,箭頭操作符將 Lambda 表達(dá)式拆分成兩部分:
左側(cè):Lambda 表達(dá)式的參數(shù)列表。
右側(cè):Lambda 表達(dá)式中所需執(zhí)行的功能,用{ }包起來,即 Lambda 體。
Java Lambda 表達(dá)式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
代碼簡潔,開發(fā)迅速
方便函數(shù)式編程
非常容易進(jìn)行并行計(jì)算
Java 引入 Lambda,改善了集合操作(引入 Stream API)
缺點(diǎn):
代碼可讀性變差
在非并行計(jì)算中,很多計(jì)算未必有傳統(tǒng)的 for 性能要高
不容易進(jìn)行調(diào)試
函數(shù)式接口
Lambda 表達(dá)式實(shí)現(xiàn)的接口不是普通的接口,而是函數(shù)式接口。如果一個(gè)接口中,有且只有一個(gè)抽象的方法(Object 類中的方法不包括在內(nèi)),那這個(gè)接口就可以被看做是函數(shù)式接口。這種接口只能有一個(gè)方法。如果接口中聲明多個(gè)抽象方法,那么 Lambda 表達(dá)式會(huì)發(fā)生編譯錯(cuò)誤:
The target type of this expression must be a functional interface
這說明該接口不是函數(shù)式接口,為了防止在函數(shù)式接口中聲明多個(gè)抽象方法,Java 8 提供了一個(gè)聲明函數(shù)式接口注解 @FunctionalInterface,示例代碼如下。
// 可計(jì)算接口
@FunctionalInterface
public interface Calculable {
// 計(jì)算兩個(gè)int數(shù)值
int calculateInt(int a, int b);
}
在接口之前使用 @FunctionalInterface 注解修飾,那么試圖增加一個(gè)抽象方法時(shí)會(huì)發(fā)生編譯錯(cuò)誤。但可以添加默認(rèn)方法和靜態(tài)方法。
@FunctionalInterface 注解與 @Override 注解的作用類似。Java 8 中專門為函數(shù)式接口引入了一個(gè)新的注解 @FunctionalInterface。該注解可用于一個(gè)接口的定義上,一旦使用該注解來定義接口,編譯器將會(huì)強(qiáng)制檢查該接口是否確實(shí)有且僅有一個(gè)抽象方法,否則將會(huì)報(bào)錯(cuò)。需要注意的是,即使不使用該注解,只要滿足函數(shù)式接口的定義,這仍然是一個(gè)函數(shù)式接口,使用起來都一樣。
提示:Lambda 表達(dá)式是一個(gè)匿名方法代碼,Java 中的方法必 須聲明在類或接口中,那么 Lambda 表達(dá)式所實(shí)現(xiàn)的匿名方法是在函數(shù)式接口中聲明的。
下一篇: 沒有了
初級(jí)會(huì)計(jì)職稱中級(jí)會(huì)計(jì)職稱經(jīng)濟(jì)師注冊會(huì)計(jì)師證券從業(yè)銀行從業(yè)會(huì)計(jì)實(shí)操統(tǒng)計(jì)師審計(jì)師高級(jí)會(huì)計(jì)師基金從業(yè)資格稅務(wù)師資產(chǎn)評估師國際內(nèi)審師ACCA/CAT價(jià)格鑒證師統(tǒng)計(jì)資格從業(yè)
一級(jí)建造師二級(jí)建造師消防工程師造價(jià)工程師土建職稱房地產(chǎn)經(jīng)紀(jì)人公路檢測工程師建筑八大員注冊建筑師二級(jí)造價(jià)師監(jiān)理工程師咨詢工程師房地產(chǎn)估價(jià)師 城鄉(xiāng)規(guī)劃師結(jié)構(gòu)工程師巖土工程師安全工程師設(shè)備監(jiān)理師環(huán)境影響評價(jià)土地登記代理公路造價(jià)師公路監(jiān)理師化工工程師暖通工程師給排水工程師計(jì)量工程師
人力資源考試教師資格考試出版專業(yè)資格健康管理師導(dǎo)游考試社會(huì)工作者司法考試職稱計(jì)算機(jī)營養(yǎng)師心理咨詢師育嬰師事業(yè)單位教師招聘公務(wù)員公選考試招警考試選調(diào)生村官
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級(jí)職稱護(hù)士資格證初級(jí)護(hù)師主管護(hù)師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實(shí)踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗(yàn)技師臨床醫(yī)學(xué)理論中醫(yī)理論