標籤:多核 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、函數式介面的對象怎麼建立
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運算式