lambda表達式在jdk1.8引入,屬於函數式編程,可以在特定的場景中省去很多沒有意義的代碼,只留下核心邏輯,使代碼看起來更簡潔。 函數式介面 任何介面,如果只包含唯一一個抽象方法,那麼它就是一個函數式介面。對於函數式介面,可以通過lambda表達式來創建該介面的對象。 lambda表達式的推導 ...
lambda表達式在jdk1.8引入,屬於函數式編程,可以在特定的場景中省去很多沒有意義的代碼,只留下核心邏輯,使代碼看起來更簡潔。
函數式介面
任何介面,如果只包含唯一一個抽象方法,那麼它就是一個函數式介面。對於函數式介面,可以通過lambda表達式來創建該介面的對象。
lambda表達式的推導
1. 正常實現
//1. 首先定義一個函數式介面
interface LambdaInterface{ void lambda(); }
//2. 實現類
class LambdaImpl implements LambdaInterface{
public void lambda(){
System.out.println("lambda test");
}
}
//3. 一般實現
public class TestLambda{
//main函數
public static void main(String[] args){
//創建一個新對象,
LambdaImpl lambda = new LambdaImpl();
lambda.lambda();
}
}
2. 靜態內部類實現
將單獨的實現類添加到Test類中,作為靜態內部類,少定義了一個外部類
//1. 定義一個函數式介面
interface LambdaInterface { void lambda(); }
//2. 使用靜態內部類實現
public class TestLambda {
//實現類作為靜態內部類
static class LambdaImpl implements LambdaInterface {
public void lambda() {
System.out.println("lambda test!!");
}
}
public static void main(String[] args) {
new LmabdaImpl().lambda();
}
}
3. 通過局部內部類實現
將靜態內部類進一步簡化為局部內部類
//1. 定義一個函數式介面
interface LambdaInterface { void lambda(); }
//2. 使用局部內部類實現
public class TestLambda{
public static void main(String[] args) {
//2.實現類作為局部內部類
class LambdaImpl implements LambdaInterface{
public void lambda(){ System.out.println("lambda test!!");}
}
}
new LambdaImpl().lambda();
}
4. 通過匿名內部類實現
實現類是不需要類名的,只要實現方法即可,這裡將其作為匿名內部類,進行類名的簡化
//1. 定義一個函數式介面
interface LambdaInterface { void lambda(); }
//2. 使用匿名內部類實現
public class TestLambda{
public static void main(String[] args){
//直接在匿名內部類中實現LambdaInterface介面
LambdaTest lambda = new LambdaInterface(){
public void lambda(){
System.out.println("lambda test!!");}
}
lambda.lambda();//父類引用指向子類實例,多態
}
}
5. lambda簡化
由於介面式函數中只有一個方法,即使通過匿名內部類實現,也必須指定方法名,這是沒有意義的。因此在lambda表達式中,將預設的類名和方法名省略掉
//1. 定義一個函數式介面
interface LambdaInterface { void lambda(); }
//2. 使用lambda表達式實現
public class TestLambda{
public static void main(String[] args){
//將指定類名和方法名的過程全部省略,直接使用()->{}代替
LambdaTest lambda = ()->{ System.out.println("lambda test!!");}
lambda.lambda();//父類引用指向子類實例,多態
}
}
6. 帶有參數的lambda表達式
lambda表達式是可以帶有參數的:
//1. 定義一個帶有參數的函數式介面
interface KeyBoard{void type(Character c);}
//2. 使用lambda表達式實現
public class Test2{
public static void main(String[] args){
KeyBoard keyBoard = (Character c) -> {
System.out.println(c + " was pressed");
};
}
}
6.1 簡化參數類型
由於函數式介面只有一個方法,不存在重載的情況,因此參數列表式固定的,可以省略參數的類型:
//1. 定義一個帶有參數的函數式介面
interface KeyBoard{void type(Character c);}
//2. 使用lambda表達式實現
public class Test2{
public static void main(String[] args){
KeyBoard keyBoard = (c) -> { //省略了參數的類型
System.out.println(c + " was pressed");
};
keyBoard.type('a');
}
}
6.2 省略小括弧
當lambda表達式只有一個參數的時候,連包裹參數列表的小括弧也是可以省略的:
//1. 定義一個帶有參數的函數式介面
interface KeyBoard{void type(Character c);}
//2. 使用lambda表達式實現
public class Test2{
public static void main(String[] args){
KeyBoard keyBoard = c -> {
System.out.println(c + " was pressed");
};
keyBoard.type('a');
}
}
6.3 省略花括弧
當lambda表達式實現的方法只有一條語句的時候,甚至還可以省略包裹方法體的花括弧:
//1. 定義一個帶有參數的函數式介面
interface KeyBoard{void type(Character c);}
//2. 使用lambda表達式實現
public class Test2{
public static void main(String[] args){
KeyBoard keyBoard = c -> System.out.println(c + " was pressed");
keyBoard.type('a');
}
}
希望可以幫到你,還有未來的我