jdk8 方法引用 或者說雙冒號

2021-09-20 10:05:44 字數 2610 閱讀 4572

還是本著先學習的態度看看這個特性長什麼樣。然後看看到底代表了什麼。一般用在什麼地方。

第一種 static方法的引用

就是你如果有個類有個靜態方法。你可以直接寫

containingclass::staticmethodname

但是我有個疑問。這麼寫了之後。這個整體表示的是啥。如果照以前containingclass.staticmethodname也是可以呼叫啊。其實這就引出了乙個問題。方法引用的目的是啥。現在看起來好像主要是當成方法呼叫的乙個引數。至少我現在看到的基本是作為引數在使用。那既然能當成是引數。這說明代表是乙個例項。既然是例項。就肯定背後是個類。但是能這麼多層隱身表達的。只有我們提到的函式式介面才有這個能力。 也就是這麼寫。雖然是乙個方法。但是背後一定有乙個函式式介面來對應。我們來看例子

例子一。靜態方法是沒有引數的。沒有返回值。

其實這種代表的函式介面比較好找到。 runnable就是

例子2,靜態方法沒有引數,但是有返回值。也好找callable

例子3,靜態方法有乙個入參,沒有返回值。能想到的就是consumer。這裡有幾個分支。就是靜態方法的引數是具體型別。還是泛型。跟呼叫方法的consumer是否指定型別。看例子。

這裡的test3 跟 test33 乙個是指定了具體型別。乙個是用的泛型。那對應得方法引用的例子就有三種。可以指定consumer型別。比如intconsumer。也可以直接用consumer。但是對應的能呼叫的靜態方法的寫法是不同的。這裡就不一一舉例了。反正用不對。編譯器會提示你如何修改。

看完這三個例子。基本對方法引用是用來幹什麼的有個初步印象了。說白了就是不同類之間方法呼叫方法。因為有了函式式介面。函式本身可以作為引數傳遞。弄雙冒號可以省略寫很多引數。在某些**的語義上重點突出了函式含義本身。因為有時候不是太關心引數。

第二種 classname::new

這種就是類名 直接加雙冒號new 。那這個整體代表的也應該是乙個例項。是classname的例項麼。應該不是。應該還是跟之前的那種。背後一定是某個函式式介面的例項。到底是哪個函式式介面呢.可以是任何構造器方法的函式式介面。看例子

functionrefencetest這個類是預設構造器的。所以test55的入參用sumpplier就符合了 。如果functionrefencetest的構造器是乙個帶引數的呢。也就是有入參。有返回結果的那種。我想到的是function。乙個入參。乙個返回結果。看**

同樣是functionrefencetest::new 看出背後的含義是不一樣的。

第三種 containingobject::instancemethodname

這種雙冒號前面是乙個類的例項。後面的方法名是這個類的普通方法。通過列舉過程我們還發現了。這些方法都把引數給省略了。真神奇。

這個形式跟第一種的靜態類行很像。區別就是如果傳入的方法是非靜態的。非static。那如果還想用怎麼辦。雙冒號的左邊就不能用類的名字了。必須是乙個類的例項。

這個例子舉的不好。都是同乙個類。正常來說呼叫的類a跟 入參方法的所在的類b 通常是不一樣的。這裡舉例是為了證明語法ok

方便。最後一種 最複雜的一種 containingtype::methodname

這個雙冒號前面是類名a。後面是普通方法b。這種複雜了。但是根據經驗整體代表的依然是某個函式式介面的例項。當然這個函式式介面的方法第乙個引數一定是這個類名a或者a的子類。然後其他的引數一定跟這個普通方法b一模一樣。但是關鍵還是在於函式式介面。還是看例子

這裡就沒用具體的函式呼叫來說明了。只是用了乙個myinter m定義。這裡很明顯左邊還是類名test1。右邊是普通的方法a。這是沒有引數也沒有返回值的情況。注意看函式式介面的裡頭的第乙個引數。恰巧是入參類test1.也就是說要要能寫成普通類名雙冒號普通方法這種簡單寫法。這個函式式介面的的第乙個引數必須是被呼叫方法類或者他的子類。

再看個有引數的

還是符合剛才的假定。所以一切的一切都是在於函式式介面如何定義。

jdk8 方法引用

方法引用的形式 方法引用的標準形式是 類名 方法名。注意 只需要寫方法名,不需要寫括號 有以下四種形式的方法引用 型別 示例 引用靜態方法 containingclass staticmethodname 引用某個物件的例項方法 containingobject instancemethodname...

jdk8 方法引用 lambda 匿名內部類

匿名內部類 lambda和方法引用其實是相通的,從匿名內部類到lambda到方法引用是乙個進化的過程,是乙個簡化的過程,更加是乙個從抽象的過程。作用都是實現介面方法,換句話說就是實現介面 只是這個介面只有乙個抽象方法。匿名內部類省去了實現類,直接new 介面名 沒有實現類名,實際就是實現且建立了乙個...

jdk8 之方法引用

方法引用 實際上是lamda函式的語法糖 有時候並不適用 我們可以講方法引用看做乙個函式指標.function pointer 方法引用分為4類 類名 靜態方法名 建立乙個類 public class student public void setname string name public in...