溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java中的方法如何引用

發(fā)布時間:2022-06-14 09:42:52 來源:億速云 閱讀:106 作者:iii 欄目:編程語言

這篇文章主要介紹了Java中的方法如何引用的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Java中的方法如何引用文章都會有所收獲,下面我們一起來看看吧。

Java中的方法如何引用

什么是方法引用?

其實(shí)我們就從字面就開始理解,方法大家都知道,就是我們在編寫代碼的時候定義的方法。而方法引用就是用什么東西來引用這個方法。而引用方法說白了它的目的就是對Lambda表達(dá)式的一個進(jìn)一步優(yōu)化,從而減少代碼的一個更簡單的編寫。對!你沒有聽錯,Lambda表達(dá)式已經(jīng)很優(yōu)化了,那還要怎么優(yōu)化呢?當(dāng)我們的代碼中出現(xiàn)了對應(yīng)的類、對象、super、this的時候我們就可以使用方法引用,而這個方法引用的前提就是我們有Lambda表達(dá)式。那它是怎么樣來用的呢?我們就接著往下看吧。

方法引用符

既然標(biāo)題是方法引用符,什么是方法引用符呢?方法引用符就是雙冒號【::】,這就是方法引用,而這也是一種新語法,是一種引用運(yùn)算符,方法引用就是通過它來實(shí)現(xiàn)的。如果Lambda要表達(dá)的函數(shù)方案已經(jīng)存在于某個方法的實(shí)現(xiàn)中,我們就可以通過雙冒號來引用該方法實(shí)現(xiàn)對Lambda的代替。

注意:Lambda中傳遞的參數(shù)一定是方法引用中那個方法可接受的類型,否則會拋出異常。

如何使用方法引用?

方法引用可以通過以下幾方面來使用:

Java中的方法如何引用

既然是有以上幾種方式的方法引用,那我們接下來就逐一進(jìn)行學(xué)習(xí)一下吧。

通過對象名引用成員方法

那怎樣來通過對象名引用方法呢?我們知道對象是通過類來創(chuàng)建的,所以我們首先要創(chuàng)建一個類,然后再類中定義一個成員方法,再通過類創(chuàng)建一個對象,用對去引用這個成員方法。

例如:

定義一個成員方法,傳遞字符串,把字符串按照大寫輸出

我們把上面的需求來實(shí)現(xiàn)一下吧。

先定義一個類

public class Demo02MethodRerObject {

//定義一個成員方法,傳遞字符串,把字符串按照大寫輸出

public void printUpperCaseString(String s){

System.out.println(s.toUpperCase());

}

}

既然是輸出我們就需要打印出來,而用Lambdab就需要我們定義一個打印的函數(shù)式接口,在函數(shù)式接口中定義打印字符串的抽象方法。

/*

定義一個打印的函數(shù)式接口

*/

@FunctionalInterface

public interface Printable {

//定義打印字符串的抽象方法

void print(String s);

}

而通過對象名引用成員方法,使用前提是對象名已經(jīng)存在的,成員方法也是存在的,就可以使用對象名來引用成員方法。下面我們用代碼寫一下:首先我們用Lambda來寫一下這個需求,然后再進(jìn)行用方法引用優(yōu)化Lambda。

public class Demo03ObjectMethodReference {

//定義一個方法,方法參數(shù)傳遞Printable接口

public static void pringString(Printable p){

p.print("abcde");

}

public static void main(String[] args) {

//pringString(System.out::print);

//調(diào)用printString方法,方法的參數(shù)pringable是一個函數(shù)式接口,所以可以傳遞Lambda

pringString((s)->{

//創(chuàng)建MethodRerObject對象

Demo02MethodRerObject methodRerObject=new Demo02MethodRerObject();

//調(diào)用Demo02MethodRerObject對象中的成員方法printUpperCaseString,把字符串按照大寫輸出

methodRerObject.printUpperCaseString(s);

});

/*

使用方法引用優(yōu)化Lambda

對象已經(jīng)存在Demo02MethodRerObject

成員方法也是已經(jīng)存在的printUpperCaseString

所以我們可以使用對象名引用成員方法

*/

Demo02MethodRerObject methodRerObject=new Demo02MethodRerObject();

pringString(methodRerObject::printUpperCaseString);

}

}

通過類名引用靜態(tài)方法

前面我們學(xué)過,我們類中有靜態(tài)方法時,我們就可以通過類名來調(diào)用靜態(tài)方法,而方法引用也一樣,也可以通過類名來引用靜態(tài)方法。下面我們同樣使用代碼來演示。

這次我們定義一個方法,方法的參數(shù)傳遞計(jì)算絕對值的整數(shù)和函數(shù)式接口Calcable

先來定義一個接口

@FunctionalInterface

public interface Calcable {

//定義一個抽象方法,傳遞一個整數(shù),對整數(shù)進(jìn)行絕對值計(jì)算并返回

int AbsCals(int number);

}

通過類名引用靜態(tài)成員方法,前提是類已經(jīng)存在,靜態(tài)成員方法也已經(jīng)存在,就可以通過類名直接引用靜態(tài)成員方法。我們同樣先創(chuàng)建類,定義方法,用Lambda編寫代碼,之后用方法引用優(yōu)化。

public class Demo04StaticMethodReference {

//定義一個方法,方法的參數(shù)傳遞計(jì)算絕對值的整數(shù)和函數(shù)式接口Calcable

public static int method1(int number,Calcable c){

return c.AbsCals(number);

}

public static void main(String[] args) {

//調(diào)用method方法,傳遞計(jì)算絕對值的整數(shù)和lambda表達(dá)式

int number=method1(-10,(n)->{

//對參數(shù)進(jìn)行絕對值計(jì)算并返回結(jié)果

return Math.abs(n);

});

System.out.println(number);

/*

使用方法引用優(yōu)化Lambdab表達(dá)式

Math類是存在的

abs計(jì)算絕對值的靜態(tài)方法也是存在的

所以我們可以直接通過類名引用靜態(tài)方法

*/

int number2=method1(-10, Math::abs);

System.out.println(number2);

}

}

通過super引用成員方法

提到super說明和父類方法有關(guān),也就是有繼承關(guān)系。當(dāng)存在繼承關(guān)系,Lambda中需要super調(diào)用時,為我們就是有是有方法引用進(jìn)行代替。

定義一個見面的方法

我們使用子父類見面打招呼的方法進(jìn)行演示

同樣這次我們定義見面的函數(shù)式接口

/*

定義見面的函數(shù)式接口

*/

@FunctionalInterface

public interface Greetable {

//定義一個見面的方法

void greet();

}

既然需要繼承我們定義一個父類

/*

定義父類方法

*/

public class Demo05Fu_Human {

//定義一個sayHello的方法

public void sayHello(){

System.out.println("Hello! 我是Human。");

}

}

再定義一個子類,在子類中出現(xiàn)父類的成員方法,先使用Lambda編寫代碼,再進(jìn)行方法引用優(yōu)化。

使用super引用父類的成員方法,前提super是已經(jīng)存在的,父類的成員方法也是存在的,就可以直接使用super引用父類成員方法。

import java.nio.channels.ShutdownChannelGroupException;

/*

定義子類

*/

public class Demo06Zi_Man extends Demo05Fu_Human {

//子類重寫父類sayHello方法

@Override

public void sayHello() {

System.out.println("Hello!我是Man。");

}

//定義一個方法,參數(shù)傳遞Gerrtable接口

public void method(Greetable g){

g.greet();

}

public void show(){

//調(diào)用method方法,方法參數(shù)Greetable是一個函數(shù)式接口,所以可以傳遞Lambda表達(dá)式

method(()->{

//創(chuàng)建父類的Human對象

Demo05Fu_Human fHuman=new Demo05Fu_Human();

fHuman.sayHello();

});

//因?yàn)橛凶痈割愱P(guān)系,所以存在的一個關(guān)鍵super,代表父類,可以直接使用super調(diào)用父類的成員方法

method(()->{

super.sayHello();

});

/*

使用super引用類的成員方法

super是已經(jīng)存在的

父類的成員方法也是存在的

使用可以直接使用super引用父類成員方法

*/

method(super::sayHello);

}

public static void main(String[] args) {

//調(diào)用show方法

new Demo06Zi_Man().show();

}

}

通過this引用成員方法

既然上面用super引用了父類的成員方法,我們之前也學(xué)過this也可以調(diào)用本類的成員方法,那同樣this也可以引用本類的成員方法。

示例:

定義一個買房子的方法

同樣,首先定義函數(shù)式接口。

/*

定義一個富有的函數(shù)式接口

*/

@FunctionalInterface

public interface Richable {

//定義一個想買什么就買什么的方法

void buy();

}

然后怎么創(chuàng)建類,再定義買房子的方法。通過this引用成員方法,前提t(yī)his是已經(jīng)存在的,買房子的成員方法也是存在的,就可以直接使用this引用成員方法。同樣先使用Lambda編寫代碼,再進(jìn)行方法引用優(yōu)化。

/*

通過this引用本類的成員方法

*/

public class Demo07_Husband {

//定義一個買房子的方法

public void buyHouse(){

System.out.println("北京二環(huán)內(nèi)買一套四合院!");

}

//定義一個結(jié)婚的方法,參數(shù)傳遞Richable接口

public void marry(Richable r){

r.buy();

}

//定義一個高興的方法

public void soHappy(){

//調(diào)用結(jié)婚的方法,方法的參數(shù)Richable是一個函數(shù)式接口,傳遞Lambda表達(dá)式

marry(()->{

//使用this,成員方法,調(diào)用本類買房子的方法

this.buyHouse();

});

/*

使用方法引用優(yōu)化Lambda

this是已經(jīng)存在的

買房子的成員方法也是存在的

可以直接使用this引用成員方法

*/

marry(this::buyHouse);

}

public static void main(String[] args) {

new Demo07_Husband().soHappy();

}

}

類的構(gòu)造器引用

類的構(gòu)造器引用也叫構(gòu)造方法引用。而由于構(gòu)造器名稱和類名完全一樣,所以構(gòu)造器引用格式是這樣的,類名稱::new的格式表示。既然是構(gòu)造器引用也就是構(gòu)造方法引用,所以我們需要:

定義一個Person類。

/*

person類

*/

public class Person {

private String name;

public Person() {

super();

// TODO Auto-generated constructor stub

}

public Person(String name) {

super();

this.name = name;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

然后創(chuàng)建一個Person對象的函數(shù)式接口

*

定義一個創(chuàng)建erson對象的函數(shù)式接口

*/

@FunctionalInterface

public interface PersonBuilder {

//定義一個方法,根據(jù)傳遞的姓名,創(chuàng)建person對象返回

Person buliderPerson(String name);

}

再傳遞一個方法,參數(shù)傳遞姓名和PersonBulider接口,方法中通過 姓名創(chuàng)建Person對象。類的構(gòu)造器引用,前提構(gòu)造方法new Person(String name)已知,創(chuàng)建對象已知 new,就可以使用Person引用new創(chuàng)建對象。同樣先使用Lambda編寫代碼,再進(jìn)行方法引用優(yōu)化。

/*

類的構(gòu)造器(構(gòu)造方法)引用

*/

import java.time.chrono.MinguoChronology;

import javax.print.attribute.standard.PrinterName;

public class Demo08Person {

//傳遞一個方法,參數(shù)傳遞姓名和PersonBulider接口,方法中通過 姓名創(chuàng)建Person對象

public static void printName(String name,PersonBuilder pb){

Person person=pb.buliderPerson(name);

System.out.println(person.getName());

}

public static void main(String[] args) {

//調(diào)用printName方法,方法的參數(shù)傳遞了函數(shù)式接口,我們可以使用Lambda表達(dá)式

printName("張三",(name)->{

return new Person(name);

});

/*使用方法引用優(yōu)化Lambda表達(dá)式

構(gòu)造方法new Person(String name)已知

創(chuàng)建對象已知 new

就可以使用Person引用new創(chuàng)建對象*/

printName("痛而不言笑而不語的淺傷",Person::new);

}

}

數(shù)組的構(gòu)造器引用

數(shù)組也是Object的子類,所以它也有方法引用,只是語法上稍有不同。

示例:

定義一個方法

方法的參數(shù)傳遞創(chuàng)建數(shù)組的長度和ArrayBulider接口

方法內(nèi)部根據(jù)創(chuàng)建的長度使用ArrayBuilder中的方法創(chuàng)建數(shù)組并返回

同樣,先創(chuàng)建一個數(shù)組的函數(shù)式接口

/*

定義一個創(chuàng)建數(shù)組的函數(shù)式接口

*/

@FunctionalInterface

public interface ArrayBulider {

// 定義一個int類型的數(shù)組方法,參數(shù)傳遞數(shù)組的長度,返回創(chuàng)建好的int類型的數(shù)組

int[] buliderArray(int length);

}

方法的參數(shù)傳遞創(chuàng)建數(shù)組的長度和ArrayBulider接口,方法內(nèi)部根據(jù)創(chuàng)建的長度使用ArrayBuilder中的方法創(chuàng)建數(shù)組并返回。前提,已知創(chuàng)建的就是int[]數(shù)組,數(shù)組的長度也是已知的,就可以通過數(shù)組int[]引用new,根據(jù)參數(shù)傳遞的長度來創(chuàng)建數(shù)組同樣先使用Lambda編寫代碼,再進(jìn)行方法引用優(yōu)化。

import java.lang.reflect.Array;

import java.util.Arrays;

/*

數(shù)組的構(gòu)造器引用

*/

public class Demo09Array_BuilderArray {

/*
定義一個方法

方法的參數(shù)傳遞創(chuàng)建數(shù)組的長度和ArrayBulider接口

方法內(nèi)部根據(jù)創(chuàng)建的長度使用ArrayBuilder中的方法創(chuàng)建數(shù)組并返回

*/

public static int[] arrayLength(int length,ArrayBulider ab){

return ab.buliderArray(length);

}

public static void main(String[] args) {

//調(diào)用arrayLength方法、傳遞數(shù)組的長度和Lambda表達(dá)式

int[]arr=arrayLength(10,(len)->{

return new int[len];

});

System.out.println(arr.length);

/*使用方法引用優(yōu)化Lambda表達(dá)式

已知創(chuàng)建的就是int[]數(shù)組

數(shù)組的長度也是已知的

就可以通過數(shù)組int[]引用new,根據(jù)參數(shù)傳遞的長度來創(chuàng)建數(shù)組*/

int[]arr1=arrayLength(5, int[]::new);

System.out.println(arr1.length);

System.out.println(Arrays.toString(arr1));

}

}

關(guān)于“Java中的方法如何引用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Java中的方法如何引用”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI