大家好,我是IT修真院上海分院第02期學員,一枚正直善良的java程序員。
今天給分享一下關于Java中Lambda表達式的相關知識。
背景介紹
Lambda表達式式Java8的重要更新,Lambda表達式支持將代碼塊作為方法參數,可以使用Lambda實現以更簡潔的代碼來創建只有一個抽象方法的接口的實例
知識剖析
組成:
形參列表,如果形參列表中只有一個參數,可以將圓括號省略
箭頭,由英文的中劃線和大于符號組成
代碼塊,如果代碼塊中只包含一條語句,可以省略代碼塊的花括號
匿名內部類:
適合于創建那種只需要一次使用的類,創建匿名內部類時會立即創建一個該類的實例,這個類定義立即消失,匿名內部類不能重復使用
必須繼承一個父類或實現一個接口
Lambda表達式可用于簡化匿名內部類對象,代替匿名內部類的繁瑣語法
函數式接口:
函數式接口代表只包含一個抽象方法的接口
Lambda表達式的類型,也被稱為目標類型,目標類型必須是函數式接口
Lambda表達式的結果就是被當成對象,所以可以使用Lambda表達式進行賦值
常見問題
Lambda表達式只能為函數式接口創建對象,所以以下的代碼會報錯
Object obj = () -> System.out.println()
解決方案
可以使用函數式接口對Lambda表達式進行強制類型轉換
Object obj =(interface) () -> System.out.println()
編碼實戰
定義一個函數式接口
/**
* 函數式接口,只有一個抽象方法
*/
public interface A {
void testA();
}
使用匿名內部類在傳入方法參數時創建A類型的對象:
lambdaTest.atest(new A() {
public void testA(){
System.out.println("這是匿名類的演示");
}
});
使用lambda表達式在傳入方法參數時創建A類型的對象:
lambdaTest.atest(()-> System.out.println("這是一個Lambda演示"));
擴展思考
Lambda表達式與匿名內部類的區別:
匿名類可以為任意的接口創建實例
Lambda表達式的代碼塊不允許調用接口中定義的默認方法
更多討論:
匿名類的好處
答:
可以訪問該類定義所在的作用域中的數據,包括私有的數據;
可以對同一個包中的其他類隱藏起來;
可以使用匿名內部類定義回調函數,節省代碼;
這個表達式有啥優勢??
答:
通常是在需要一個函數,但是又不想費神去命名一個函數的場合下使用,可以進一步節省匿名內部類的代碼
lambda的使用場景
答:
可能是在GUI里,添加監聽器之類的時候
PPT:https://ptteng.github.io/PPT/PPT-java/java-task10-lambda.html
視頻:https://v.qq.com/x/page/y0526976l5q.html