Java 函數式編程和Lambda表達式

  一、Java 8最重要的新特性java

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

 

  二、函數式編程函數式編程

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

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

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

  函數式編程用函數來表達全部的概念,完成全部的操做。面向對象編程中,把對象看成參數傳遞,而在函數式編程中,函數能夠做爲其餘函數的參數傳遞,返回值也能夠是函數。code

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

 

  三、Lambda表達式使用場合對象

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

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

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

 

  四、Lambda表達式語法

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

  語法:  

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

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

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

  

  五、什麼是函數式接口

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

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

  

  六、函數式接口和Lambda表達式的聯繫

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

 

  七、函數式接口的對象怎麼建立

  • 標準方法建立;
  • 使用Lambda表達式建立。(能夠簡化代碼)
    /*Lambda表達式建立函數式接口的對象*/
    interface Converter{
        Integer convert(String from);
    }
    Converter converter=(from)->Integer.valueOf(from);
    Integer integer=converter.convert(「123」);

  八、自動類型推到

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

  因爲convert()只有一個參數,因此from必定是String類型的。

 

  九、方法引用

  Lambda表達式到底意味着什麼?任何一個Lambda表達式均可以被看成某個函數接口中的惟一抽象方法的匿名描述符。

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

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

/*至關於讓Converter接口的方法等價於Integer::valueOf()*/
Converter converter=Integer::valueof();
Integer integer=converter.convert(「123」);

 

  

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

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

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

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