前言:隻有基礎(多态、匿名接口實作類)足夠紮實才能更好的學習花拳繡腿(lamda表達式),Lambda 表達式,也可稱為閉包,它是推動 Java 8 釋出的最重要新特性。Lambda 允許把函數作為一個方法的參數(函數作為參數傳遞進方法中)。使用 Lambda 表達式可以使代碼變的更加簡潔緊湊,但可讀性很差;傳統的匿名接口實作類寫法顯得代碼啰嗦,但是思路更條理;
interface MathOperation{
int operation(int a, int b);
}
interface NoReturen{
void say(String s);
}
public class LamdaTest {
private int operate(int a, int b, MathOperation mathOperation){
return mathOperation.operation(a, b);
}
public static void main(String[] args) {
LamdaTest lt = new LamdaTest();
//以下是【MathOperation】(有參數有傳回值類型)的【傳統接口匿名實作類】和【lamda表達式】
MathOperation mo = new MathOperation() {
@Override
public int operation(int a,int b) {
return a+b;
}
};
System.out.println(mo.operation(1,1));//輸出的結果為2
//lamda表達式寫法,每一個lamda表達式都相當于一個接口匿名實作類對象;mo1與mo是等價的
MathOperation mo1 = (a,b) -> a+b;
//===================================================================================
//以下是【NoReturen】(也有參數但沒有傳回值類型)的【傳統接口匿名實作類】和【lamda表達式】
NoReturen noReturen = new NoReturen() {
@Override
public void say(String s) {
System.out.println(s);
}
};
noReturen.say("hello");
NoReturen noReturen1 = s -> System.out.println(s);
noReturen.say("hello");
//=================================================================================
//帶大家複習一下多态,這裡調用operate方法來列印結果
MathOperation mo2 = (a,b) -> a-b;
MathOperation mo3 = (a,b) -> a*b;
MathOperation mo4 = (a,b) -> a/b;
System.out.println("2+1=" +lt.operate(2,1,mo2)); //3
System.out.println("2-1=" +lt.operate(2,1,mo3)); //1
System.out.println("2*1=" +lt.operate(2,1,mo4)); //2
System.out.println("2*1=" +lt.operate(2,1,mo4)); //2
}
}
總結:
有傳回值類型的lamda表達式寫法:(parameters) -> expression
沒有傳回值類型的lamda表達式寫法:(parameters) ->{ statements; }
以下是lambda表達式的重要特征:
1 可選類型聲明:不需要聲明參數類型,編譯器可以統一識别參數值。
2 可選的參數圓括号:一個參數無需定義圓括号,但多個參數需要定義圓括号。
3 可選的大括号:如果主體包含了一個語句,就不需要使用大括号。
4 可選的傳回關鍵字:如果主體隻有一個表達式傳回值則編譯器會自動傳回值,大括号需要指定明表達式傳回了一個數值。
Lambda 表達式主要用來定義行内執行的方法類型接口,例如,一個簡單方法接口。在上面例子中,我們使用各種類型的Lambda表達式來定義MathOperation接口的方法。然後我們定義了sayMessage的執行。Lambda 表達式免去了使用匿名方法的麻煩,并且給予Java簡單但是強大的函數化的程式設計能力。
lambda 表達式隻能引用标記了 final 的外層局部變量,這就是說不能在 lambda 内部修改定義在域外的局部變量,否則會編譯錯誤