亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長(zhǎng)資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    深入解析Java中的方法引用

    本篇文章給大家?guī)?lái)了關(guān)于java的相關(guān)知識(shí),其中主要介紹了關(guān)于方法引用的相關(guān)問(wèn)題,方法大家都知道,就是我們?cè)诰帉?xiě)代碼的時(shí)候定義的方法。而方法引用就是用什么東西來(lái)引用這個(gè)方法。而引用方法說(shuō)白了它的目的就是對(duì)Lambda表達(dá)式的一個(gè)進(jìn)一步優(yōu)化,從而減少代碼的一個(gè)更簡(jiǎn)單的編寫(xiě),希望對(duì)大家有幫助。

    深入解析Java中的方法引用

    推薦學(xué)習(xí):《java視頻教程》

    什么是方法引用?

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

    方法引用符

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

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

    如何使用方法引用?

    方法引用可以通過(guò)以下幾方面來(lái)使用:

    深入解析Java中的方法引用

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

    通過(guò)對(duì)象名引用成員方法

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

    例如:

    定義一個(gè)成員方法,傳遞字符串,把字符串按照大寫(xiě)輸出

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

    先定義一個(gè)類(lèi)

    public class Demo02MethodRerObject {  //定義一個(gè)成員方法,傳遞字符串,把字符串按照大寫(xiě)輸出  public void printUpperCaseString(String s){  System.out.println(s.toUpperCase());  }  }

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

    /*  定義一個(gè)打印的函數(shù)式接口  */  @FunctionalInterface  public interface Printable {  //定義打印字符串的抽象方法  void print(String s);  }

    而通過(guò)對(duì)象名引用成員方法,使用前提是對(duì)象名已經(jīng)存在的,成員方法也是存在的,就可以使用對(duì)象名來(lái)引用成員方法。下面我們用代碼寫(xiě)一下:首先我們用Lambda來(lái)寫(xiě)一下這個(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,把字符串按照大寫(xiě)輸出  methodRerObject.printUpperCaseString(s);  });  /*  使用方法引用優(yōu)化Lambda  對(duì)象已經(jīng)存在Demo02MethodRerObject  成員方法也是已經(jīng)存在的printUpperCaseString  所以我們可以使用對(duì)象名引用成員方法  */  Demo02MethodRerObject methodRerObject=new Demo02MethodRerObject();  pringString(methodRerObject::printUpperCaseString);  }  }

    通過(guò)類(lèi)名引用靜態(tài)方法

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

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

    先來(lái)定義一個(gè)接口

    @FunctionalInterface  public interface Calcable {  //定義一個(gè)抽象方法,傳遞一個(gè)整數(shù),對(duì)整數(shù)進(jìn)行絕對(duì)值計(jì)算并返回  int AbsCals(int number);  }

    通過(guò)類(lèi)名引用靜態(tài)成員方法,前提是類(lèi)已經(jīng)存在,靜態(tài)成員方法也已經(jīng)存在,就可以通過(guò)類(lèi)名直接引用靜態(tài)成員方法。我們同樣先創(chuàng)建類(lèi),定義方法,用Lambda編寫(xiě)代碼,之后用方法引用優(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類(lèi)是存在的  abs計(jì)算絕對(duì)值的靜態(tài)方法也是存在的  所以我們可以直接通過(guò)類(lèi)名引用靜態(tài)方法  */  int number2=method1(-10, Math::abs);  System.out.println(number2);  }  }

    通過(guò)super引用成員方法

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

    定義一個(gè)見(jiàn)面的方法

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

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

    /*  定義見(jiàn)面的函數(shù)式接口  */  @FunctionalInterface  public interface Greetable {  //定義一個(gè)見(jiàn)面的方法  void greet();  }

    既然需要繼承我們定義一個(gè)父類(lèi)

    /*  定義父類(lèi)方法  */  public class Demo05Fu_Human {  //定義一個(gè)sayHello的方法  public void sayHello(){  System.out.println("Hello! 我是Human。");  }  }

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

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

    import java.nio.channels.ShutdownChannelGroupException;  /*  定義子類(lèi)  */  public class Demo06Zi_Man extends Demo05Fu_Human {  //子類(lèi)重寫(xiě)父類(lèi)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)建父類(lèi)的Human對(duì)象  Demo05Fu_Human fHuman=new Demo05Fu_Human();  fHuman.sayHello();  });  //因?yàn)橛凶痈割?lèi)關(guān)系,所以存在的一個(gè)關(guān)鍵super,代表父類(lèi),可以直接使用super調(diào)用父類(lèi)的成員方法  method(()->{  super.sayHello();  });  /*  使用super引用類(lèi)的成員方法  super是已經(jīng)存在的  父類(lèi)的成員方法也是存在的  使用可以直接使用super引用父類(lèi)成員方法  */  method(super::sayHello);  }  public static void main(String[] args) {  //調(diào)用show方法  new Demo06Zi_Man().show();  }  }

    通過(guò)this引用成員方法

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

    示例:

    定義一個(gè)買(mǎi)房子的方法

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

    /*  定義一個(gè)富有的函數(shù)式接口  */  @FunctionalInterface  public interface Richable {  //定義一個(gè)想買(mǎi)什么就買(mǎi)什么的方法  void buy();  }

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

    /*  通過(guò)this引用本類(lèi)的成員方法  */  public class Demo07_Husband {  //定義一個(gè)買(mǎi)房子的方法  public void buyHouse(){  System.out.println("北京二環(huán)內(nèi)買(mǎ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)用本類(lèi)買(mǎi)房子的方法  this.buyHouse();  });  /*  使用方法引用優(yōu)化Lambda  this是已經(jīng)存在的  買(mǎi)房子的成員方法也是存在的  可以直接使用this引用成員方法  */  marry(this::buyHouse);  }  public static void main(String[] args) {  new Demo07_Husband().soHappy();  }  }

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

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

    定義一個(gè)Person類(lèi)。

    /*  person類(lèi)  */  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接口,方法中通過(guò) 姓名創(chuàng)建Person對(duì)象。類(lèi)的構(gòu)造器引用,前提構(gòu)造方法new Person(String name)已知,創(chuàng)建對(duì)象已知 new,就可以使用Person引用new創(chuàng)建對(duì)象。同樣先使用Lambda編寫(xiě)代碼,再進(jìn)行方法引用優(yōu)化。

    /*  類(lèi)的構(gòu)造器(構(gòu)造方法)引用  */  import java.time.chrono.MinguoChronology;  import javax.print.attribute.standard.PrinterName;  public class Demo08Person {  //傳遞一個(gè)方法,參數(shù)傳遞姓名和PersonBulider接口,方法中通過(guò) 姓名創(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("痛而不言笑而不語(yǔ)的淺傷",Person::new);  }  }

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

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

    示例:

    定義一個(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類(lèi)型的數(shù)組方法,參數(shù)傳遞數(shù)組的長(zhǎng)度,返回創(chuàng)建好的int類(lèi)型的數(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)度也是已知的,就可以通過(guò)數(shù)組int[]引用new,根據(jù)參數(shù)傳遞的長(zhǎng)度來(lái)創(chuàng)建數(shù)組同樣先使用Lambda編寫(xiě)代碼,再進(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)度也是已知的  就可以通過(guò)數(shù)組int[]引用new,根據(jù)參數(shù)傳遞的長(zhǎng)度來(lái)創(chuàng)建數(shù)組*/  int[]arr1=arrayLength(5, int[]::new);  System.out.println(arr1.length);  System.out.println(Arrays.toString(arr1));  }  }

    推薦學(xué)習(xí):《java視頻教程》

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)