JDK1.8新特性

jdk1.8的新特性打破了許多原有的設計方案。
接口方法定義擴展
接口使用問題:一個接口可有多個子類,假設接口中有三萬個子類,若有一天接口缺了個方法,所有子類實現相同,此時需要將方法實現3W次
核心問題在於:接口只是一個方法的聲明,而沒有實現,若出現以上問題,接口無法使用·
從JDK1.8開始,提供了兩類新結構:
1、使用default定義普通方法,需要通過對象(m)調用
2、使用static定義靜態方法,通過接口名即可調用

此時的接口更加像抽象類,但最大的不同還是:接口的子類依舊是多繼承,而抽象類只能實現單繼承。
當一個接口的子類十分多時,才考慮用此擴充功能,但此操作不屬於標準設計,而屬挽救設計。

Lambda表達式
jdk1.8開始的重要新特性,很多開發語言都支持函數式編程,最具代表性的是haskell,很多人覺得面向對象的概念過於完整,結構操作不明確
例子:使用匿名內部類實現接口,最大好處:節約一個類文件,缺點:看的暈

於是對於此類操作有了更簡化的實現,使用函數式編程Lambda

面向對象語法最大的侷限在於結構必須非常完整。
但如果要使用函數式編程有一個前提:接口必須只有一個方法,一個以上無法使用
若有一個接口就是爲Lambda編程而生的,最好定義的時候就限定其只能有一個方法,所以出現一個新註解:@FunctionInterface,以便在定義時就發現錯誤。
實際上對於以上語法形式:
  • (參數) -> 單行語句
代碼對應關係:
此時方法本身中只包含一行,就直接寫
若方法中包含多行語句,則需要用{}
  • (參數)->{多行語句 。。。}
若表達式中只有一行進行返回,則可直接使用語句,不必寫return

不習慣慢慢習慣,行業內有一家公司基於java做了一套函數式編程語言:scala
最終解析完是java,一般拿來做數據分析。
方法引用(Lamada的補充)
從最初,只要進行引用都是針對引用類型而言的,只有數組,類,接口具備引用操作,
現在追加了方法引用的概念。
引用的本質就是別名,所以方法引用也是別名使用,有四種形式
  • 引用靜態方法:類名稱 :: static 方法名稱
  • 引用某對象的方法: 實例化對象 :: 普通方法名
  • 引用某個特定類的方法: 類名 :: 普通方法
  • 引用構造方法: 類名 :: new
例子:引用某特定類的方法

直接使用現有函數,相當於爲方法起了個別名
例子:引用某對象的方法

例子:引用類中普通方法

例子:引用構造方法

不太好用,想用就用
內建函數式接口(JDK1.8已經提供了一系列的函數式接口)
Lambda實際上爲了簡化方法引用而存在,Lambda的核心在於函數式接口,函數式接口的核心在於該接口只有一個方法。實際上在函數式編程中只需要四類接口,jdk1.8中提供了java.util.function包,其中有下列四類函數式接口:
  • 功能型函數式接口(唯一方法有參T有返回值R)
輸入數據,數據處理後輸出
public interface Function<T,R>{
R apply(T t)
}
  • 供給型函數式接口(唯一方法無參有返回值R)

public interface Supplier<T>{
T get();
}
  • 消費型函數式接口(唯一方法有參T無返回值)
public interface Consumer<T>{
void accept(T t);
}
  • 斷言型函數式接口(唯一方法有參T返回boolean值)
public interface Predicate<T>{
boolean test(T t);
}
方法無參無返回值,有參無返回值,無參有返回值,有參有返回值
使用功能型函數式接口Funciton(String.valueof):

還提供了一些擴展的函數式接口(限定了參數或者返回值):

使用供給型函數式接口("hello".toUpperCase):

使用消費型函數式接口(syso):

使用斷言型函數式接口(isEmpty):

提供這些接口只是把操作標準化,大不了自己寫接口

參考:阿里雲棲李興華老師java基礎高級視頻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章