Java 函數式編程和Lambda表達式


  1、Java 8最重要的新特性

  Lambda表達式、接口改進(默認方法)和批數據處理。

 

  2、函數式編程

  本質上來說,編程關注兩個維度:數據和數據上的操作。

  面向對象的編程泛型強調讓操作圍繞數據,這樣可以實現以類為單位的重用,當為類添加新的數據類型時,原有代碼無需修改。

  函數式編程是一種不同的編程模型,它以操作(函數)為中心,強調變量不變性。函數式編程的准則是不依賴外部的數據,也不改變外部數據的值。這一特性滿足了多核並行程序設計的需求,因此能簡化並行程序開發。

  函數式編程用函數來表達所有的概念,完成所有的操作。面向對象編程中,把對象當作參數傳遞,而在函數式編程中,函數可以作為其他函數的參數傳遞,返回值也可以是函數。

  從開發者角度看,函數式編程不支持賦值操作,一個函數的執行只會返回一個值or函數,不會有任何副作用,所以看上去,一個函數就是一個大表達式。

 

  3、Lambda表達式使用場合

  Lambda表達式實現了函數式編程,能夠讓開發者將程序代碼如同數據一樣使用。方法可以被當作參數傳遞到其他方法內,如同對象實例或數。

  使用場合:通常是在需要一個函數,但是又不想費神去命名一個函數的場合下使用,也就是指匿名函數。

  Lambda表達式可以用於替換廣泛使用的內部匿名類實現回調功能,用於事件響應器。

 

  4、Lambda表達式語法

  Lambda表達式是一個能夠作為參數傳遞的匿名函數對象,它沒有名字,有參數列表、函數體、返回類型,也可以拋出異常。它的類型是函數接口(Functional Interface)。

  語法:  

  1)  形式參數:即參數列表,就是函數式接口里方法的參數。

  2) 向右的箭頭(->):起分割作用。

  3)  方法體。表達式或者代碼塊,是函數式接口中方法的實現。(可以return返回值)

  

  5、什么是函數式接口

  函數式接口指僅包含一個抽象方法的接口。

  java.lang.Runnable、java.util.Comparator是典型的函數式接口

  

  6、函數式接口和Lambda表達式的聯系

  Lambda表達式需要一個函數式接口作為其對應類型,而它的方法體就是函數接口的實現。每一個該接口類型的Lambda表達式都會被匹配到該接口的抽象方法。

 

  7、函數式接口的對象怎么創建

  • 標准方法創建;
  • 使用Lambda表達式創建。(可以簡化代碼)
    /*Lambda表達式創建函數式接口的對象*/
    interface Converter{
        Integer convert(String from);
    }
    Converter converter=(from)->Integer.valueOf(from);
    Integer integer=converter.convert(“123”);

  8、自動類型推到

  上面的代碼中,編譯器知道Converter只有一個方法convert(),所以convert()方法肯定對應表達式(from)->Integer.valueOf(from);

  由於convert()只有一個參數,所以from一定是String類型的。

 

  9、方法引用

  Lambda表達式到底意味着什么?任何一個Lambda表達式都可以被當作某個函數接口中的唯一抽象方法的匿名描述符。

  可以使用某個類的某個具體方法代表這個描述符,即為方法引用。這樣,就無須綁定方法引用到某個實例,直接將實例作為功能接口的參數進行傳遞。

  方法的引用通過::符號來實現,方法引用被認為是和Lambda表達式一樣的,可用於功能接口所適用的地方。

/*相當於讓Converter接口的方法等價於Integer::valueOf()*/
Converter converter=Integer::valueof();
Integer integer=converter.convert(“123”);

 

  

  10、新特性——接口的默認方法(default)

  接口的默認方法是為了解決接口演化問題,即新版本中對接口進行修改,會導致早期版本的代碼無法運行。因為接口中的方法必須被實現,若在接口中添加新方法,可能進行大量重構。所以,若往一個接口中添加新的方法,可以提供該方法的默認實現。

  有了默認方法,對已有的接口使用者來說,代碼可以繼續運行。新的代碼可以繼續使用該方法,也可以重寫默認的實現。

interface Formula{
    double calculate(int a);
/*新增的方法,提供一個默認實現*/ 
    default double sqrt (int a) {
    return Math.sqrt(s);
    }
}

 


免責聲明!

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



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