前言:只有基礎(多型、匿名介面實作類)足夠扎實才能更好的學習花拳繡腿(lamda運算式),Lambda 運算式,也可稱為閉包,它是推動 Java 8 發布的最重要新特性,Lambda 允許把函式作為一個方法的引數(函式作為引數傳遞進方法中),使用 Lambda 運算式可以使代碼變的更加簡潔緊湊,但可讀性很差;傳統的匿名介面實作類寫法顯得代碼啰嗦,但是思路更條理;
函式式介面:只有一個抽象方法的介面就是函式式介面,我們還可以通過來@FunctionalInterface標識這是一個函式式介面這個小技術是堪稱java歷史性的轉折,意味著java不再是單純OOP語言,現在的java已經開始支持OOF(面向物件)了,這也是為了緩解python,scala等近期火爆技術帶來的壓力!
lamda運算式與函式式介面的關系:lamda運算式通常創建的是該介面的匿名實作類物件,別的編程語言中lamda都是作為函式的,所有在lamda運算式在java中必須依附與一個特殊的結構,那就是函式式介面,所以lamda運算式寫起來也挺別扭
@FunctionalInterface
interface MathOperation{
int operation(int a, int b);
}
@FunctionalInterface
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 內部修改定義在域外的區域變數,否則會編譯錯誤
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/252994.html
標籤:java
