新聞中心
這篇文章主要介紹了Java中的方法如何引用的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Java中的方法如何引用文章都會(huì)有所收獲,下面我們一起來看看吧。
創(chuàng)新互聯(lián)公司是一家專業(yè)提供隆子企業(yè)網(wǎng)站建設(shè),專注與做網(wǎng)站、成都網(wǎng)站制作、H5場(chǎng)景定制、小程序制作等業(yè)務(wù)。10年已為隆子眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

什么是方法引用?
其實(shí)我們就從字面就開始理解,方法大家都知道,就是我們?cè)诰帉懘a的時(shí)候定義的方法。而方法引用就是用什么東西來引用這個(gè)方法。而引用方法說白了它的目的就是對(duì)Lambda表達(dá)式的一個(gè)進(jìn)一步優(yōu)化,從而減少代碼的一個(gè)更簡(jiǎn)單的編寫。對(duì)!你沒有聽錯(cuò),Lambda表達(dá)式已經(jīng)很優(yōu)化了,那還要怎么優(yōu)化呢?當(dāng)我們的代碼中出現(xiàn)了對(duì)應(yīng)的類、對(duì)象、super、this的時(shí)候我們就可以使用方法引用,而這個(gè)方法引用的前提就是我們有Lambda表達(dá)式。那它是怎么樣來用的呢?我們就接著往下看吧。
方法引用符
既然標(biāo)題是方法引用符,什么是方法引用符呢?方法引用符就是雙冒號(hào)【::】,這就是方法引用,而這也是一種新語法,是一種引用運(yùn)算符,方法引用就是通過它來實(shí)現(xiàn)的。如果Lambda要表達(dá)的函數(shù)方案已經(jīng)存在于某個(gè)方法的實(shí)現(xiàn)中,我們就可以通過雙冒號(hào)來引用該方法實(shí)現(xiàn)對(duì)Lambda的代替。
注意:Lambda中傳遞的參數(shù)一定是方法引用中那個(gè)方法可接受的類型,否則會(huì)拋出異常。
如何使用方法引用?
方法引用可以通過以下幾方面來使用:

既然是有以上幾種方式的方法引用,那我們接下來就逐一進(jìn)行學(xué)習(xí)一下吧。
通過對(duì)象名引用成員方法
那怎樣來通過對(duì)象名引用方法呢?我們知道對(duì)象是通過類來創(chuàng)建的,所以我們首先要?jiǎng)?chuàng)建一個(gè)類,然后再類中定義一個(gè)成員方法,再通過類創(chuàng)建一個(gè)對(duì)象,用對(duì)去引用這個(gè)成員方法。
例如:
定義一個(gè)成員方法,傳遞字符串,把字符串按照大寫輸出
我們把上面的需求來實(shí)現(xiàn)一下吧。
先定義一個(gè)類
public class Demo02MethodRerObject {
//定義一個(gè)成員方法,傳遞字符串,把字符串按照大寫輸出
public void printUpperCaseString(String s){
System.out.println(s.toUpperCase());
}
}既然是輸出我們就需要打印出來,而用Lambdab就需要我們定義一個(gè)打印的函數(shù)式接口,在函數(shù)式接口中定義打印字符串的抽象方法。
/*
定義一個(gè)打印的函數(shù)式接口
*/
@FunctionalInterface
public interface Printable {
//定義打印字符串的抽象方法
void print(String s);
}而通過對(duì)象名引用成員方法,使用前提是對(duì)象名已經(jīng)存在的,成員方法也是存在的,就可以使用對(duì)象名來引用成員方法。下面我們用代碼寫一下:首先我們用Lambda來寫一下這個(gè)需求,然后再進(jìn)行用方法引用優(yōu)化Lambda。
public class Demo03ObjectMethodReference {
//定義一個(gè)方法,方法參數(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是一個(gè)函數(shù)式接口,所以可以傳遞Lambda
pringString((s)->{
//創(chuàng)建MethodRerObject對(duì)象
Demo02MethodRerObject methodRerObject=new Demo02MethodRerObject();
//調(diào)用Demo02MethodRerObject對(duì)象中的成員方法printUpperCaseString,把字符串按照大寫輸出
methodRerObject.printUpperCaseString(s);
});
/*
使用方法引用優(yōu)化Lambda
對(duì)象已經(jīng)存在Demo02MethodRerObject
成員方法也是已經(jīng)存在的printUpperCaseString
所以我們可以使用對(duì)象名引用成員方法
*/
Demo02MethodRerObject methodRerObject=new Demo02MethodRerObject();
pringString(methodRerObject::printUpperCaseString);
}
}通過類名引用靜態(tài)方法
前面我們學(xué)過,我們類中有靜態(tài)方法時(shí),我們就可以通過類名來調(diào)用靜態(tài)方法,而方法引用也一樣,也可以通過類名來引用靜態(tài)方法。下面我們同樣使用代碼來演示。
這次我們定義一個(gè)方法,方法的參數(shù)傳遞計(jì)算絕對(duì)值的整數(shù)和函數(shù)式接口Calcable。
先來定義一個(gè)接口
@FunctionalInterface
public interface Calcable {
//定義一個(gè)抽象方法,傳遞一個(gè)整數(shù),對(duì)整數(shù)進(jìn)行絕對(duì)值計(jì)算并返回
int AbsCals(int number);
}通過類名引用靜態(tài)成員方法,前提是類已經(jīng)存在,靜態(tài)成員方法也已經(jīng)存在,就可以通過類名直接引用靜態(tài)成員方法。我們同樣先創(chuàng)建類,定義方法,用Lambda編寫代碼,之后用方法引用優(yōu)化。
public class Demo04StaticMethodReference {
//定義一個(gè)方法,方法的參數(shù)傳遞計(jì)算絕對(duì)值的整數(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ì)算絕對(duì)值的整數(shù)和lambda表達(dá)式
int number=method1(-10,(n)->{
//對(duì)參數(shù)進(jìn)行絕對(duì)值計(jì)算并返回結(jié)果
return Math.abs(n);
});
System.out.println(number);
/*
使用方法引用優(yōu)化Lambdab表達(dá)式
Math類是存在的
abs計(jì)算絕對(duì)值的靜態(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)用時(shí),為我們就是有是有方法引用進(jìn)行代替。
定義一個(gè)見面的方法
我們使用子父類見面打招呼的方法進(jìn)行演示
同樣這次我們定義見面的函數(shù)式接口
/*
定義見面的函數(shù)式接口
*/
@FunctionalInterface
public interface Greetable {
//定義一個(gè)見面的方法
void greet();
}既然需要繼承我們定義一個(gè)父類
/*
定義父類方法
*/
public class Demo05Fu_Human {
//定義一個(gè)sayHello的方法
public void sayHello(){
System.out.println("Hello! 我是Human。");
}
}再定義一個(gè)子類,在子類中出現(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。");
}
//定義一個(gè)方法,參數(shù)傳遞Gerrtable接口
public void method(Greetable g){
g.greet();
}
public void show(){
//調(diào)用method方法,方法參數(shù)Greetable是一個(gè)函數(shù)式接口,所以可以傳遞Lambda表達(dá)式
method(()->{
//創(chuàng)建父類的Human對(duì)象
Demo05Fu_Human fHuman=new Demo05Fu_Human();
fHuman.sayHello();
});
//因?yàn)橛凶痈割愱P(guān)系,所以存在的一個(gè)關(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也可以引用本類的成員方法。
示例:
定義一個(gè)買房子的方法
同樣,首先定義函數(shù)式接口。
/*
定義一個(gè)富有的函數(shù)式接口
*/
@FunctionalInterface
public interface Richable {
//定義一個(gè)想買什么就買什么的方法
void buy();
}然后怎么創(chuàng)建類,再定義買房子的方法。通過this引用成員方法,前提t(yī)his是已經(jīng)存在的,買房子的成員方法也是存在的,就可以直接使用this引用成員方法。同樣先使用Lambda編寫代碼,再進(jìn)行方法引用優(yōu)化。
/*
通過this引用本類的成員方法
*/
public class Demo07_Husband {
//定義一個(gè)買房子的方法
public void buyHouse(){
System.out.println("北京二環(huán)內(nèi)買一套四合院!");
}
//定義一個(gè)結(jié)婚的方法,參數(shù)傳遞Richable接口
public void marry(Richable r){
r.buy();
}
//定義一個(gè)高興的方法
public void soHappy(){
//調(diào)用結(jié)婚的方法,方法的參數(shù)Richable是一個(gè)函數(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)造方法引用,所以我們需要:
定義一個(gè)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)建一個(gè)Person對(duì)象的函數(shù)式接口
*
定義一個(gè)創(chuàng)建erson對(duì)象的函數(shù)式接口
*/
@FunctionalInterface
public interface PersonBuilder {
//定義一個(gè)方法,根據(jù)傳遞的姓名,創(chuàng)建person對(duì)象返回
Person buliderPerson(String name);
}再傳遞一個(gè)方法,參數(shù)傳遞姓名和PersonBulider接口,方法中通過 姓名創(chuàng)建Person對(duì)象。類的構(gòu)造器引用,前提構(gòu)造方法new Person(String name)已知,創(chuàng)建對(duì)象已知 new,就可以使用Person引用new創(chuàng)建對(duì)象。同樣先使用Lambda編寫代碼,再進(jìn)行方法引用優(yōu)化。
/*
類的構(gòu)造器(構(gòu)造方法)引用
*/
import java.time.chrono.MinguoChronology;
import javax.print.attribute.standard.PrinterName;
public class Demo08Person {
//傳遞一個(gè)方法,參數(shù)傳遞姓名和PersonBulider接口,方法中通過 姓名創(chuàng)建Person對(duì)象
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)建對(duì)象已知 new
就可以使用Person引用new創(chuàng)建對(duì)象*/
printName("痛而不言笑而不語的淺傷",Person::new);
}
}數(shù)組的構(gòu)造器引用
數(shù)組也是Object的子類,所以它也有方法引用,只是語法上稍有不同。
示例:
定義一個(gè)方法
方法的參數(shù)傳遞創(chuàng)建數(shù)組的長(zhǎng)度和ArrayBulider接口
方法內(nèi)部根據(jù)創(chuàng)建的長(zhǎng)度使用ArrayBuilder中的方法創(chuàng)建數(shù)組并返回
同樣,先創(chuàng)建一個(gè)數(shù)組的函數(shù)式接口
/*
定義一個(gè)創(chuàng)建數(shù)組的函數(shù)式接口
*/
@FunctionalInterface
public interface ArrayBulider {
// 定義一個(gè)int類型的數(shù)組方法,參數(shù)傳遞數(shù)組的長(zhǎng)度,返回創(chuàng)建好的int類型的數(shù)組
int[] buliderArray(int length);
}方法的參數(shù)傳遞創(chuàng)建數(shù)組的長(zhǎng)度和ArrayBulider接口,方法內(nèi)部根據(jù)創(chuàng)建的長(zhǎng)度使用ArrayBuilder中的方法創(chuàng)建數(shù)組并返回。前提,已知?jiǎng)?chuàng)建的就是int[]數(shù)組,數(shù)組的長(zhǎng)度也是已知的,就可以通過數(shù)組int[]引用new,根據(jù)參數(shù)傳遞的長(zhǎng)度來創(chuàng)建數(shù)組同樣先使用Lambda編寫代碼,再進(jìn)行方法引用優(yōu)化。
import java.lang.reflect.Array;
import java.util.Arrays;
/*
數(shù)組的構(gòu)造器引用
*/
public class Demo09Array_BuilderArray {
/*
定義一個(gè)方法
方法的參數(shù)傳遞創(chuàng)建數(shù)組的長(zhǎng)度和ArrayBulider接口
方法內(nèi)部根據(jù)創(chuàng)建的長(zhǎ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ù)組的長(zhǎng)度和Lambda表達(dá)式
int[]arr=arrayLength(10,(len)->{
return new int[len];
});
System.out.println(arr.length);
/*使用方法引用優(yōu)化Lambda表達(dá)式
已知?jiǎng)?chuàng)建的就是int[]數(shù)組
數(shù)組的長(zhǎng)度也是已知的
就可以通過數(shù)組int[]引用new,根據(jù)參數(shù)傳遞的長(zhǎng)度來創(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)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Java中的方法如何引用”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
新聞標(biāo)題:Java中的方法如何引用
網(wǎng)站地址:http://www.dlmjj.cn/article/pegdcd.html


咨詢
建站咨詢
