jdk1.8 -- 自定義FunctionInterface


一.自定義函數的理解

  對於java提供的一些函數,用lambda表達式是可以解決一些問題的,但是在對於一些比較復雜的數據類型在處理時,可能會有些力不從心了,但是

我們可以通過自定義的一些函數,通過使用lambda的方式來執行,這樣就可以節省不必要的麻煩。

二.自定義函數的過程

  1.定義原數據

  2.自定義FunctionInterface

  3.測試類

 

//原數據
public
class Persion { private String name; private Integer age; private Integer phoneNum; public Persion(String name, Integer age, Integer phoneNum) { this.name = name; this.age = age; this.phoneNum = phoneNum; } @Override public String toString() { return "Persion [name=" + name + ", firstName=" + firstName + ", lastName=" + lastName + ", address=" + address + ", age=" + age + ", phoneNum=" + phoneNum + "]"; } }
//定義FunctionInterface
@FunctionalInterface
public interface ConsumerPersion<A,B,C,D> { D create(A a,B b,C c); }
//在接口上添加FunctionInterface
//以表示該函數只有唯一的一個方法,在通過編譯調用時,不會產生歧義
//測試類
public
class MainTest { public static void main(String[] args) { Persion persion = createPersion("張三",23,123,(a,b,c) -> new Persion(a,b,c)); System.out.println(persion); } public static Persion createPersion(String name,int age,int number,ConsumerPersion<String, Integer, Integer, Persion> cp){ return cp.create(name, age, number); } }
//定義調用函數
在ConsumerPersion這個泛型接口中定義了4種數據類型,A,B,C,D, 而函數create的定義是傳入A,B,C,返回D,因此我們可以知道,D就是返回的Persion,而A,B,C則是persion
中包含的屬性的數據類型,再通過構造函數,可以確定A,B,C的數據類型,分別是String,Integer,Integer,因此確定了泛型接口中泛型參數的數據類型,以及返回值
//執行流程
當執行createPersion()這個方法時,需要傳入參數name,age,number,同時還有一個帶有泛型的接口,當我們把正常的參數name,age,number傳入后,對於這個泛型接口的傳參
我們可以隨便寫3個變量代替,可推導出要返回的Persion,通過構造函數將3個變量傳入。

三.對lambda函數使用的理解

對於函數lambda的的使用,其實就是匿名函數的應用推導的過程,我們要實現ConsumerPersion中的方法,最簡單、最直接的就是寫一個匿名函數來實現
new ConsumerPersion<String,Integer,Integer,Persion>(){
  @override
  public Persion create(String name,Integer age,Integer phoneNum){
    
      return new Persion(name,age,phoneNum);
  }
}
但是從jdk1.8之后,它對於這樣的代碼直接進行了優化,不需要寫這樣的代碼,而是通過特殊字符來標識這樣的代碼
createPersion("張三",23,123,(a,b,c)-> new Persion(a,b,c))
當虛擬機加載到這段代碼時,會通過這些特殊的標識符,並通過加載標記為@FunctionInterface 的函數,動態的生成相應的代碼,以實現相對應的需求,
這樣做的目的,大大的簡化了開發者的工作量

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM