1. lambda表達式簡介
閉包也被稱為 lambda 表達式真朗,讓您能夠使用運箭頭算符“->”來創(chuàng)建只有一個方法的類的對象棍厂,它是推動 Java 8 發(fā)布的最重要新特性棕孙,使用 Lambda 表達式可以使代碼變的更加簡潔緊湊,典型的應用是JavaFX的事件響應函數(shù)
lambda表達式格式:
(形式參數(shù)) -> {代碼塊}
例如最簡單的lambda表達式:
Runnable runner = () -> { System.out.println("Hello脖律,World!"); };
即:
Runnable runner = () -> {
System.out.println("Hello谢肾,World!");
};
2. lambda表達式的簡化
其實lambda表達式和匿名內(nèi)部類是相似的,可以認為lambda表達式就是由匿名內(nèi)部類簡化而來小泉。
Interface01這是一個接口芦疏,現(xiàn)在使用匿名內(nèi)部類來實現(xiàn)接口中的方法如下:
Interface01這是一個接口
Interface01 interface01 = new Interface01() {
@Override
public void show() {
System.out.println("啦啦啦");
}
};
interface01.show();
在匿名內(nèi)部類的寫法中,我們知道new的一定是個接口微姊,所以需要省略接口名和大括號酸茴,所以得到如下:
因為接口內(nèi)部只有一個抽象方法,所以需要省略抽象方法的名稱兢交、修飾符薪捍、返回值,所以得到如下:
結合Lambda的格式(形式參數(shù)) -> {代碼塊}配喳,在參數(shù)的小括號和代碼塊的大括號中間加 -> 符號酪穿,所以得到如下:
Interface interface01 = ()->{System.out.println("啦啦啦")}
3. 帶參數(shù)的lambda表達式
設存在一個接口Interface02如下:
public interface Interface02 {
int add(int a, int b);
}
lambda表達式實現(xiàn)接口:
Interface02 interface02 = (int a,int b) -> {
return a+b;
};
interface02.add(1,2);
參數(shù)類型可以省略,但不能只省略一部分【如改為(int a,b)】
Interface02 interface02 = (a, b) -> {
return a+b;
};
interface02.add(1,2);
如果代碼塊語句只有一行晴裹,可以省略大括號和分號被济。如果這一行包括return,return也必須要省略
Interface02 interface02 = (a, b) -> a+b;
interface02.add(1,2);
如果參數(shù)只有一個涧团,可以省略參數(shù)的小括號
Interface03 in03 = (a) -> System.out.println(a);
即:
Interface03 in03 = a -> System.out.println(a);
4. lambda表達式實現(xiàn)接口
interface Proudcts {
public void proudcts();
}
class GoogleProudct {
GoogleProudct(Proudcts pd) {
pd.proudcts();
}
}
interface Addition2 {
public void addition2(int a, int b);
}
class Sum {
Sum(Addition2 addt) {
addt.addition2(10, 20);
}
}
interface Addition {
public int addition(int a, int b);
}
public class LambdaLearn {
public static void main(String[] args) {
/**
* Use lambda to implement an interface
* with only one abstract method
*/
GoogleProudct gp = new GoogleProudct(() -> {
System.out.println("Android OS 10");
});
/**
* (argument) -> (body)
* (arg1, arg2...) -> { body }
*/
Sum sum = new Sum((i, j) -> {
System.out.println(i + j);
});
/**
* (argument) -> (body)
* (arg1, arg2...) -> { body }
*/
Addition additions = (i, j) -> {
return i + j;
}; // Addition additions = (i, j) -> i + j;
System.out.println("Addition:" + additions.addition(100, 200));
additions = (i, j) -> (i + j); // Addition addition = (i, j) -> {return(i + j)};
System.out.println("Addition:" + additions.addition(300, 500));
}
}
5. 注意事項
使用Lambda必須要有上下文環(huán)境只磷,如果沒有相應的前因后果,編譯器也不知道我們表達是具體是哪個接口泌绣。編譯器可以通過根據(jù)局部變量的賦值得知
Runnable r = ()-> xxxx;
根據(jù)調(diào)用方法的參數(shù)得知
new Thread(()-> xxxx).start();