Java 函數式編程和Lambda運算式

來源:互聯網
上載者:User

標籤:多核   ring   新版本   orm   外部   代碼   將執行個體   維度   數列   

  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運算式都可以被當作某個函數介面中的唯一抽象方法的匿名描述符。

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

  方法的引用通過::符號來實現,方法引用被認為是和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);    }}

 

Java 函數式編程和Lambda運算式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.