久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

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

深入解析Java中的方法引用

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

深入解析Java中的方法引用

推薦學(xué)習(xí):《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ù)傳遞計算絕對值的整數(shù)和函數(shù)式接口Calcable

先來定義一個接口

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

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

public class Demo04StaticMethodReference {  //定義一個方法,方法的參數(shù)傳遞計算絕對值的整數(shù)和函數(shù)式接口Calcable  public static int method1(int number,Calcable c){  return c.AbsCals(number);  }  public static void main(String[] args) {  //調(diào)用method方法,傳遞計算絕對值的整數(shù)和lambda表達(dá)式  int number=method1(-10,(n)->{  //對參數(shù)進(jìn)行絕對值計算并返回結(jié)果  return Math.abs(n);  });  System.out.println(number);  /*  使用方法引用優(yōu)化Lambdab表達(dá)式  Math類是存在的  abs計算絕對值的靜態(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));  }  }

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

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
日产精品一区二区| 亚洲欧美日韩国产一区| 黄色精品网站| 久久精品动漫| 欧美日韩激情在线一区二区三区| 免费一级欧美在线观看视频| 老鸭窝亚洲一区二区三区| 国产精一区二区| 欧美一区自拍| 卡一卡二国产精品| 国产suv精品一区二区四区视频 | 久久这里只有| 久久激情五月婷婷| 久久影院一区二区三区| sm久久捆绑调教精品一区| 日韩高清欧美| 国产韩日影视精品| 精品久久福利| 免费污视频在线一区| 91精品国产成人观看| 秋霞影院一区二区三区 | 国产日韩欧美一区| 日韩精品诱惑一区?区三区| 亚洲午夜电影| 日韩精彩视频在线观看| 精品视频99| 亚洲高清影视| 亚洲毛片在线免费| 欧美日韩一区二区国产| 亚洲毛片网站| 日韩成人精品一区| 蜜桃视频一区二区三区| 精品一区av| 免费美女久久99| 精品久久美女| 美女日韩在线中文字幕| 国产精品xxx| 亚洲视频电影在线| 欧美韩日一区| 欧美亚洲免费| 日韩国产一区二区三区| 中文字幕一区二区三区四区久久| 久久国产精品成人免费观看的软件| 婷婷亚洲五月| 国产欧美日韩亚洲一区二区三区| 99久久久久国产精品| 国产精品久久久久久久免费软件| 免费成人网www| 日韩成人a**站| 久久三级毛片| 91亚洲精品在看在线观看高清| 香蕉成人av| 精品五月天堂| 老牛国内精品亚洲成av人片| 日韩精品乱码av一区二区| 欧美国产小视频| 亚洲欧美日韩国产| 欧美成人午夜| 日韩欧美午夜| 国产理论在线| 四虎影视精品| sm久久捆绑调教精品一区| 丰满少妇一区| 国产精品伦理久久久久久| 精品国产一级| 欧美三级网址| 欧美网站在线| 一二三区精品| 91精品日本| 国产欧美亚洲一区| 久久激情婷婷| 91精品一区二区三区综合| 久久免费大视频| 欧美日韩国产欧| 在线一区欧美| 欧美一区不卡| 精品一区二区三区四区五区| 久久青草久久| 男女激情视频一区| 日本va欧美va精品发布| 麻豆精品视频在线| 欧美+亚洲+精品+三区| 最新国产精品| 老司机免费视频一区二区三区| 日本va欧美va瓶| 久久中文字幕一区二区三区| 久久久免费人体| 日韩综合一区| 欧美午夜不卡影院在线观看完整版免费| 日韩精品一卡二卡三卡四卡无卡| 视频精品一区二区| 国产精品主播| 成人羞羞视频在线看网址| 久久av在线| 久久精品国产999大香线蕉| 久久五月天小说| 欧美久久一区二区三区| 三上悠亚国产精品一区二区三区| 丝袜美腿一区二区三区| 日韩有吗在线观看| 亚洲综合电影| 天堂成人免费av电影一区| 久久午夜影院| 日韩毛片网站| 国产精品视区| 欧美日韩一区二区综合| 国产高清日韩| 亚洲三级国产| 亚洲手机视频| 欧美成a人免费观看久久| 国产精品成人**免费视频| 一本色道久久精品| 成人看片网站| 久久中文字幕一区二区三区| 国产精品亚洲一区二区三区在线观看| 在线观看一区| 日韩欧美另类一区二区| 国产精品久久777777毛茸茸| 一区二区高清| 日韩在线一区二区| 国产精品试看| 六月丁香综合| 夜夜精品视频| 国产一区二区中文| 国产91一区| 久久久影院免费| 日韩精品一区二区三区免费观看| 日韩深夜视频| 午夜av成人| 国产区精品区| 亚洲精品免费观看| 亚洲福利国产| 一区免费视频| 欧美一级专区| 日韩精品亚洲专区| 91午夜精品| 精品视频在线观看网站| 国产精品草草| 麻豆精品少妇| 日韩精品水蜜桃| 欧美女激情福利| 亚洲欧美日本国产 | 精品日韩视频| 亚洲深爱激情| 色老板在线视频一区二区| 电影天堂国产精品| 一区在线免费观看| 日本亚洲视频| 精品一级视频| 国产综合亚洲精品一区二| 日韩一级不卡| 国产欧美日韩影院| 国产成人精品一区二区三区免费 | 国产精品美女久久久久久不卡| 国产精品1区| 中文在线免费视频| 在线天堂中文资源最新版| 激情视频网站在线播放色| 日韩午夜精品| 国产成人精品一区二区三区免费| 亚洲国产一区二区三区在线播放| 日本综合精品一区| 亚洲爱爱视频| 国产精品一区高清| 欧美精品自拍| 成人三级高清视频在线看| 免费在线视频一区| 日韩大片免费观看| 国产欧美日韩精品一区二区免费 | 午夜性色一区二区三区免费视频| 国产精品麻豆成人av电影艾秋| 亚洲www啪成人一区二区| 欧美日韩一视频区二区| 亚洲成人日韩| 视频二区不卡| 麻豆精品视频在线观看免费| 蜜臀精品久久久久久蜜臀| 日本精品黄色| 日产欧产美韩系列久久99| 久久婷婷一区| 亚洲最新无码中文字幕久久 | 欧美亚洲激情| 欧美激情 亚洲a∨综合| 一区二区精品| 亚洲深夜av| 欧美特黄a级高清免费大片a级| 亚洲黄色免费看| 麻豆精品蜜桃视频网站| 欧美欧美黄在线二区| 婷婷精品进入| 日韩视频不卡| 99国产精品| 国产精品美女久久久| 一级欧洲+日本+国产| 欧美日韩国产综合网| 伊人久久亚洲影院| 亚洲一区日韩在线| 最近国产精品视频| 欧美高清一区| 夜夜嗨一区二区三区|