一殿如、概述
在學(xué)習(xí)lambda表達(dá)式之后鸭蛙,我們通常使用lambda表達(dá)式來(lái)創(chuàng)建匿名方法。然而登下,有時(shí)候我們僅僅是調(diào)用了一個(gè)已存在的方法。如下:
Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));
在Java8中,我們可以直接通過(guò)方法引用來(lái)簡(jiǎn)寫lambda表達(dá)式中已經(jīng)存在的方法被芳。
Arrays.sort(stringsArray, String::compareToIgnoreCase);
這種特性就叫做方法引用(Method Reference)缰贝。
二、什么是方法引用
?方法引用是用來(lái)直接訪問(wèn)類或者實(shí)例的已經(jīng)存在的方法或者構(gòu)造方法畔濒。方法引用提供了一種引用而不執(zhí)行方法的方式剩晴,它需要由兼容的函數(shù)式接口構(gòu)成的目標(biāo)類型上下文。計(jì)算時(shí)篓冲,方法引用會(huì)創(chuàng)建函數(shù)式接口的一個(gè)實(shí)例李破。
當(dāng)Lambda表達(dá)式中只是執(zhí)行一個(gè)方法調(diào)用時(shí),不用Lambda表達(dá)式壹将,直接通過(guò)方法引用的形式可讀性更高一些嗤攻。方法引用是一種更簡(jiǎn)潔易懂的Lambda表達(dá)式。
注意方法引用是一個(gè)Lambda表達(dá)式诽俯,其中方法引用的操作符是雙冒號(hào)"::"妇菱。
三、四種方法引用類型
方法引用的標(biāo)準(zhǔn)形式是:類名::方法名暴区。(注意:只需要寫方法名闯团,不需要寫括號(hào))
有以下四種形式的方法引用:
類型示例
引用靜態(tài)方法:ContainingClass::staticMethodName
引用某個(gè)對(duì)象的實(shí)例方法:containingObject::instanceMethodName
引用某個(gè)類型的任意對(duì)象的實(shí)例方法:ContainingType::methodName
引用構(gòu)造方法:ClassName::new
四、超類上的實(shí)例方法引用
組成語(yǔ)法格式:super::methodName
方法的名稱由methodName指定仙粱,通過(guò)使用super房交,可以引用方法的超類版本。
還可以捕獲this 指針伐割,this :: equals? 等價(jià)于lambda表達(dá)式? x -> this.equals(x);
五痘括、數(shù)組構(gòu)造方法引用
組成語(yǔ)法格式:TypeName[]::new
例子:
int[]::new 是一個(gè)含有一個(gè)參數(shù)的構(gòu)造器引用舟铜,這個(gè)參數(shù)就是數(shù)組的長(zhǎng)度。等價(jià)于lambda表達(dá)式? x -> new int[x]。
假想存在一個(gè)接收int參數(shù)的數(shù)組構(gòu)造方法
IntFunction arrayMaker =int[]::new;int[] array = arrayMaker.apply(10)// 創(chuàng)建數(shù)組 int[10]