java複習第10天---10.1---函數式接口
目錄
內容
1、概述
有且僅有一個抽象方法的接口,稱爲函數式接口。
&emps; 函數式接口,既適用於函數式編程場景的接口。而Java中的函數式編程思想體現爲Lambda,所有函數式接口適用於Lambda使用的接口。只有確保接口中有且僅有1個抽象方法,Java中的Lambda才能順利地進行推導。
-
語法糖:使用更加方便,但是原理不變的代碼語法。例如集合變量中的for-each 和迭代器
-
格式
@FunctionalInterface 修飾符 interface 接口名 { public abstract 返回值類型 方法名(參數列表); }
-
解析:
- @FunctionalInterface:用於檢測該接口是否爲一個函數式接口
2、使用
使用函數式接口有三種形式:
-
創建函數式接口的實現類對象
-
內明內部類
-
Lambda表達式
-
示例2-1:
package feature.jdk8.functionalinterface; @FunctionalInterface public interface MyFunctionalInterface { void method(); } package feature.jdk8.functionalinterface; public class MyFunctionalInterfaceImpl implements MyFunctionalInterface{ @Override public void method() { System.out.println("函數式接口實現類實現抽象方法"); } } package feature.jdk8.functionalinterface; public class TestFunctionalInterface1 { public static void main(String[] args) { // 1、實現類 show(new MyFunctionalInterfaceImpl()); // 2、匿名內部類 show(new MyFunctionalInterface() { @Override public void method() { System.out.println("匿名內部類實現函數式接口抽象方法"); } }); // 3、Lambda表達式 show(() -> System.out.println("Lambda表達式實現函數式接口抽象方法")); } public static void show(MyFunctionalInterface mf) { mf.method(); } } 測試結果: 函數式接口實現類實現抽象方法 匿名內部類實現函數式接口抽象方法 Lambda表達式實現函數式接口抽象方法
3、Lambda表達式優化
3.1、Lambda的延遲執行
有些場景的代碼執行後,結果不一定會被使用,從而造成性能浪費。而Lambda表達式是延遲執行的,正好可以作爲解決方案,提升性能。
3.2、性能浪費的日誌案例(簡單)
下面爲按級別不同輸出不同的日誌信息。
-
代碼3.2-1:
package feature.jdk8.lambda; public class TestLambdaLog1 { public static void main(String[] args) { String msg1 = "Hello"; String msg2 = " World"; String msg3 = " Java"; log(1, msg1 + msg2 + msg3); log(2, msg1 + msg2 + msg3); } // 根據日誌級別不同,顯示不同信息 public static void log(int level, String msg) { if(level == 1) { System.out.println(msg); } } }
-
問題分析:無論級別是否滿足需求,作爲log方法第二個參數,三個字符串都會執行拼接,傳入方法內,然後進行級別判斷。如果級別不符合要求,那麼字符串拼接操作白做了,造成性能浪費。
3.3、Lambda表達式優化
使用Lambda表達式優化上面的日誌案例:
-
Lambda特點:延遲加載
-
使用前提:函數式接口
-
函數式接口代碼3.3-1:功能實現消息拼接
package feature.jdk8.lambda; @FunctionalInterface public interface MessageBuilder{ String builder(); // 拼接信息 } package feature.jdk8.lambda; public class TestLambdaLog2 { public static void main(String[] args) { String msg1 = "Hello"; String msg2 = " World"; String msg3 = " Java"; log(1, () -> msg1 + msg2 + msg3); } // 根據日誌級別不同,顯示不同信息 public static void log(int level, MessageBuilder mb) { if(level == 1) { System.out.println(mb.builder()); } } }
-
解析:
- 使用Lambda表達式傳遞參數,僅僅吧參數傳遞到log方法中
- 只有滿足條件,日誌等級是1級
- 纔會調用接口的builder方法進行字符串的拼接
- 如果條件不滿足,接口的builder方法不會執行,自然不會進行字符串的拼接
後記 :
本項目爲參考某馬視頻開發,相關視頻及配套資料可自行度娘或者聯繫本人。上面爲自己編寫的開發文檔,持續更新。歡迎交流,本人QQ:806797785
前端項目源代碼地址:https://gitee.com/gaogzhen/vue-leyou
後端JAVA源代碼地址:https://gitee.com/gaogzhen/JAVA