java複習第10天---10.1---Java8新特性---函數式接口

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章