- Lambda表達(dá)式是java 8 新增的特性
- Lambda表達(dá)式主要作用:支持將代碼塊作為方法參數(shù),允許使用更簡(jiǎn)潔的代碼創(chuàng)建函數(shù)式接口的實(shí)例筝野,是匿名內(nèi)部類(lèi)的一種簡(jiǎn)化,可以部分取代匿名內(nèi)部類(lèi)的作用。
- 函數(shù)式接口:只有一個(gè)抽象方法的接口皂冰。
- Lambda表達(dá)式又稱(chēng)為匿名函數(shù)(anonymous function),表示一類(lèi)無(wú)需定義標(biāo)識(shí)符(函數(shù)名)的函數(shù)或者子程序养篓,可以看做是一種語(yǔ)法糖秃流。
Lambda 表達(dá)式語(yǔ)法格式
Lambda表達(dá)式在java中由三部分組成:
- 形參列表:形參列表允許省略形參類(lèi)型,如果形參列表只有一個(gè)參數(shù)柳弄,形參列表外的圓括號(hào)也可以省略
- 箭頭->:箭頭不可省略
- 代碼塊:如果代碼塊只有一條語(yǔ)句舶胀,允許省略代碼塊的花括號(hào);更有甚者,只有一條return語(yǔ)句峻贮,可以省略return關(guān)鍵字席怪。
interface Eatable{
void taste();
}
interface Flyable{
void fly(String weathrer);
}
interface Addable{
int add(int a,int b);
}
public class LambdaTest {
public void eat(Eatable e) {
e.taste();
System.out.println(e);
}
public void fly(Flyable f) {
f.fly("好天氣");
System.out.println(f);
}
public void add(Addable a) {
System.out.println(a.add(5, 3));
}
public static void main(String[] args) {
LambdaTest test = new LambdaTest();
test.eat(()->System.out.println("蘋(píng)果"));
test.fly(weater->{
System.out.println("哈哈哈");
System.out.println("可以飛行");
});
// 省略形參類(lèi)型 省略花括號(hào)
test.add((a,b)->a+b);
}
}
函數(shù)式接口
- 函數(shù)式接口是指只包含一個(gè)抽象方法的接口,(可有其他默認(rèn)方法(default修飾)或者類(lèi)方法)java 8 中有大量的函數(shù)式接口如最常見(jiàn)的:Runnable纤控,ActionListener挂捻,并提供了@FunctionInterface注解,告訴編譯器執(zhí)行更嚴(yán)格的檢查船万。
Runnbale r =()->{
for(int i =0;i<100;i++){
System.out.println(i);
}
}; // 注意分號(hào)
- Lamdba 表達(dá)式的目標(biāo)類(lèi)型只能是函數(shù)式接口刻撒。
- Lambda 表達(dá)式常應(yīng)用場(chǎng)景:
- 將Lambda表達(dá)式賦值給函數(shù)式接口類(lèi)型的變量
- 作為函數(shù)接口類(lèi)型的參數(shù)傳給某個(gè)方法
- 使用函數(shù)式接口對(duì)Lambda表達(dá)式進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換
Object obj = (Runnable)()->{
System.out.println(...);
};
方法引用和構(gòu)造器引用
- 應(yīng)用場(chǎng)景:代碼塊只有一條語(yǔ)句,并且該語(yǔ)句為調(diào)用方法或者構(gòu)造器
- 應(yīng)用目的:使Lambda表達(dá)式的語(yǔ)法更為簡(jiǎn)潔
- 應(yīng)用方式:::
@FunctionalInterface
interface Converter{
Integer convert(String from);
}
// 類(lèi)方法
Converter con = from->Integer.valueOf(from);
Converter con1 = Integer::valueOf;
// 對(duì)象方法
Converter con2 = from->"hhhh".indexOf(from);
Converter con3 = "hhhh"::indexOf;
// 構(gòu)造器類(lèi)似
// ::new
Lambda表達(dá)式與匿名內(nèi)部類(lèi)的聯(lián)系和區(qū)別
- Lambda表達(dá)式簡(jiǎn)化了部分匿名內(nèi)部類(lèi)的寫(xiě)法(函數(shù)式接口)耿导,表現(xiàn)性質(zhì)和匿名內(nèi)部類(lèi)一致声怔,可以訪問(wèn)effective final局部變量,和外部類(lèi)成員變量
- 匿名內(nèi)部類(lèi)的應(yīng)用范圍更廣舱呻,它可以為任何接口創(chuàng)建實(shí)例醋火,也可以服務(wù)于抽象類(lèi)和普通類(lèi)
- 注意Lambda表達(dá)式的代碼塊不允許調(diào)用接口中定義的默認(rèn)方法