gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

深入解析Java中的方法引用

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

深入解析Java中的方法引用

推薦學習:《java視頻教程》

什么是方法引用?

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

方法引用符

既然標題是方法引用符,什么是方法引用符呢?方法引用符就是雙冒號【::】,這就是方法引用,而這也是一種新語法,是一種引用運算符,方法引用就是通過它來實現的。如果Lambda要表達的函數方案已經存在于某個方法的實現中,我們就可以通過雙冒號來引用該方法實現對Lambda的代替。

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

如何使用方法引用?

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

深入解析Java中的方法引用

既然是有以上幾種方式的方法引用,那我們接下來就逐一進行學習一下吧。

通過對象名引用成員方法

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

例如:

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

我們把上面的需求來實現一下吧。

先定義一個類

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

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

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

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

public class Demo03ObjectMethodReference {  //定義一個方法,方法參數傳遞Printable接口  public static void pringString(Printable p){  p.print("abcde");  }  public static void main(String[] args) {  //pringString(System.out::print);  //調用printString方法,方法的參數pringable是一個函數式接口,所以可以傳遞Lambda  pringString((s)->{  //創建MethodRerObject對象  Demo02MethodRerObject methodRerObject=new Demo02MethodRerObject();  //調用Demo02MethodRerObject對象中的成員方法printUpperCaseString,把字符串按照大寫輸出  methodRerObject.printUpperCaseString(s);  });  /*  使用方法引用優化Lambda  對象已經存在Demo02MethodRerObject  成員方法也是已經存在的printUpperCaseString  所以我們可以使用對象名引用成員方法  */  Demo02MethodRerObject methodRerObject=new Demo02MethodRerObject();  pringString(methodRerObject::printUpperCaseString);  }  }

通過類名引用靜態方法

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

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

先來定義一個接口

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

通過類名引用靜態成員方法,前提是類已經存在,靜態成員方法也已經存在,就可以通過類名直接引用靜態成員方法。我們同樣先創建類,定義方法,用Lambda編寫代碼,之后用方法引用優化。

public class Demo04StaticMethodReference {  //定義一個方法,方法的參數傳遞計算絕對值的整數和函數式接口Calcable  public static int method1(int number,Calcable c){  return c.AbsCals(number);  }  public static void main(String[] args) {  //調用method方法,傳遞計算絕對值的整數和lambda表達式  int number=method1(-10,(n)->{  //對參數進行絕對值計算并返回結果  return Math.abs(n);  });  System.out.println(number);  /*  使用方法引用優化Lambdab表達式  Math類是存在的  abs計算絕對值的靜態方法也是存在的  所以我們可以直接通過類名引用靜態方法  */  int number2=method1(-10, Math::abs);  System.out.println(number2);  }  }

通過super引用成員方法

提到super說明和父類方法有關,也就是有繼承關系。當存在繼承關系,Lambda中需要super調用時,為我們就是有是有方法引用進行代替。

定義一個見面的方法

我們使用子父類見面打招呼的方法進行演示

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

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

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

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

再定義一個子類,在子類中出現父類的成員方法,先使用Lambda編寫代碼,再進行方法引用優化。

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

import java.nio.channels.ShutdownChannelGroupException;  /*  定義子類  */  public class Demo06Zi_Man extends Demo05Fu_Human {  //子類重寫父類sayHello方法  @Override  public void sayHello() {  System.out.println("Hello!我是Man。");  }  //定義一個方法,參數傳遞Gerrtable接口  public void method(Greetable g){  g.greet();  }  public void show(){  //調用method方法,方法參數Greetable是一個函數式接口,所以可以傳遞Lambda表達式  method(()->{  //創建父類的Human對象  Demo05Fu_Human fHuman=new Demo05Fu_Human();  fHuman.sayHello();  });  //因為有子父類關系,所以存在的一個關鍵super,代表父類,可以直接使用super調用父類的成員方法  method(()->{  super.sayHello();  });  /*  使用super引用類的成員方法  super是已經存在的  父類的成員方法也是存在的  使用可以直接使用super引用父類成員方法  */  method(super::sayHello);  }  public static void main(String[] args) {  //調用show方法  new Demo06Zi_Man().show();  }  }

通過this引用成員方法

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

示例:

定義一個買房子的方法

同樣,首先定義函數式接口。

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

然后怎么創建類,再定義買房子的方法。通過this引用成員方法,前提this是已經存在的,買房子的成員方法也是存在的,就可以直接使用this引用成員方法。同樣先使用Lambda編寫代碼,再進行方法引用優化。

/*  通過this引用本類的成員方法  */  public class Demo07_Husband {  //定義一個買房子的方法  public void buyHouse(){  System.out.println("北京二環內買一套四合院!");  }  //定義一個結婚的方法,參數傳遞Richable接口  public void marry(Richable r){  r.buy();  }  //定義一個高興的方法  public void soHappy(){  //調用結婚的方法,方法的參數Richable是一個函數式接口,傳遞Lambda表達式  marry(()->{  //使用this,成員方法,調用本類買房子的方法  this.buyHouse();  });  /*  使用方法引用優化Lambda  this是已經存在的  買房子的成員方法也是存在的  可以直接使用this引用成員方法  */  marry(this::buyHouse);  }  public static void main(String[] args) {  new Demo07_Husband().soHappy();  }  }

類的構造器引用

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

定義一個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;  }  }

然后創建一個Person對象的函數式接口

*  定義一個創建erson對象的函數式接口  */  @FunctionalInterface  public interface PersonBuilder {  //定義一個方法,根據傳遞的姓名,創建person對象返回  Person buliderPerson(String name);  }

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

/*  類的構造器(構造方法)引用  */  import java.time.chrono.MinguoChronology;  import javax.print.attribute.standard.PrinterName;  public class Demo08Person {  //傳遞一個方法,參數傳遞姓名和PersonBulider接口,方法中通過 姓名創建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) {  //調用printName方法,方法的參數傳遞了函數式接口,我們可以使用Lambda表達式  printName("張三",(name)->{  return new Person(name);  });  /*使用方法引用優化Lambda表達式  構造方法new Person(String name)已知  創建對象已知 new  就可以使用Person引用new創建對象*/  printName("痛而不言笑而不語的淺傷",Person::new);  }  }

數組的構造器引用

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

示例:

定義一個方法

方法的參數傳遞創建數組的長度和ArrayBulider接口

方法內部根據創建的長度使用ArrayBuilder中的方法創建數組并返回

同樣,先創建一個數組的函數式接口

/*  定義一個創建數組的函數式接口  */  @FunctionalInterface  public interface ArrayBulider {  // 定義一個int類型的數組方法,參數傳遞數組的長度,返回創建好的int類型的數組  int[] buliderArray(int length);  }

方法的參數傳遞創建數組的長度和ArrayBulider接口,方法內部根據創建的長度使用ArrayBuilder中的方法創建數組并返回。前提,已知創建的就是int[]數組,數組的長度也是已知的,就可以通過數組int[]引用new,根據參數傳遞的長度來創建數組同樣先使用Lambda編寫代碼,再進行方法引用優化。

import java.lang.reflect.Array;  import java.util.Arrays;  /*  數組的構造器引用  */  public class Demo09Array_BuilderArray {  /* 定義一個方法  方法的參數傳遞創建數組的長度和ArrayBulider接口  方法內部根據創建的長度使用ArrayBuilder中的方法創建數組并返回  */  public static int[] arrayLength(int length,ArrayBulider ab){  return ab.buliderArray(length);  }  public static void main(String[] args) {  //調用arrayLength方法、傳遞數組的長度和Lambda表達式  int[]arr=arrayLength(10,(len)->{  return new int[len];  });  System.out.println(arr.length);  /*使用方法引用優化Lambda表達式  已知創建的就是int[]數組  數組的長度也是已知的  就可以通過數組int[]引用new,根據參數傳遞的長度來創建數組*/  int[]arr1=arrayLength(5, int[]::new);  System.out.println(arr1.length);  System.out.println(Arrays.toString(arr1));  }  }

推薦學習:《java視頻教程》

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
www.亚洲天堂网| 日本久久久网站| 国产黄色激情视频| 午夜dv内射一区二区| 欧美少妇在线观看| 国产精品后入内射日本在线观看| 911av视频| 丰满少妇被猛烈进入高清播放| 亚洲国产欧美91| 欧美黄色一级片视频| 久久久国内精品| 天堂视频免费看| 男人天堂999| 成人小视频在线观看免费| 四季av一区二区三区| 黄色免费视频大全| 国产日韩第一页| 欧美视频国产视频| 成人在线观看a| 国产极品尤物在线| 中文字幕人妻熟女人妻洋洋| 天天色综合天天色| 精品一卡二卡三卡| 中文字幕无码精品亚洲资源网久久| 婷婷激情5月天| 午夜两性免费视频| 麻豆传传媒久久久爱| 免费无码毛片一区二三区| 亚洲精品天堂成人片av在线播放| 亚洲欧洲日本精品| www.欧美日本| 人妻精品无码一区二区三区| 精品无码一区二区三区爱欲| 亚洲五码在线观看视频| 国产又粗又长又爽又黄的视频| 国产视频手机在线播放| 国产欧美在线一区| www插插插无码视频网站| 色乱码一区二区三区熟女| 一本一道久久a久久综合蜜桃| 激情五月婷婷久久| 国产无套粉嫩白浆内谢的出处| 成年人看的毛片| 久久久久99精品成人片| 成人在线观看毛片| 久久久99精品视频| www.日本在线视频| 丁香六月激情网| 日本黄色片一级片| 美脚丝袜脚交一区二区| 男女猛烈激情xx00免费视频| 免费超爽大片黄| 成年人网站免费视频| 国产乱子伦农村叉叉叉| 高清在线观看免费| 黄色av免费在线播放| 在线免费av播放| 在线能看的av网站| 黄色网址在线免费看| 善良的小姨在线| 成年在线观看视频| 欧美日韩不卡在线视频| 国模无码视频一区二区三区| 国模无码视频一区二区三区| 无码无遮挡又大又爽又黄的视频| 久草资源站在线观看| 亚洲成人福利在线观看| 亚洲最大天堂网| 91视频福利网| 日韩美女爱爱视频| 欧洲精品一区二区三区久久| 免费高清在线观看免费| 欧美丰满熟妇xxxxx| 69久久久久久| 香蕉视频在线网址| 日本xxxxxxxxxx75| 99视频在线免费| а 天堂 在线| 日韩久久久久久久久久久久| 97国产精东麻豆人妻电影| 亚洲视频在线观看一区二区三区| 一级黄色特级片| 永久免费看av| 国产成人a亚洲精v品无码| 欧美在线aaa| 日本丰满大乳奶| 国产又大又硬又粗| 九九热免费在线观看| 亚洲国产欧美91| 国内精品视频一区二区三区| 国产a级片免费观看| 日本黄色a视频| 日韩在线一级片| 五月激情五月婷婷| 黄色片视频在线播放| 亚洲免费一级视频| 国产激情片在线观看| 久草精品在线播放| 人人妻人人澡人人爽精品欧美一区| 国产不卡一区二区视频| 拔插拔插华人永久免费| 国产欧美精品aaaaaa片| 在线观看亚洲色图| 国产freexxxx性播放麻豆| 91视频免费版污| 99热久久这里只有精品| 欧美美女一级片| 男人日女人逼逼| 99中文字幕在线| 99久久久无码国产精品6| 永久av免费在线观看| 久久久免费视频网站| 三年中国中文在线观看免费播放| 波多野结衣之无限发射| 午夜影院免费版| 亚洲综合在线网站| 久久这里只有精品23| 一级黄色在线播放| 一本大道熟女人妻中文字幕在线 | 色婷婷综合在线观看| 精品视频无码一区二区三区| 日韩精品一区二区三区四| 中文字幕第38页| 无码人妻h动漫| 嫩草影院中文字幕| 97超碰人人看| 欧美精品久久久久久久久25p| 久草热视频在线观看| 路边理发店露脸熟妇泻火| 一道本在线免费视频| 欧美成人免费高清视频| 日韩av中文字幕第一页| 国产亚洲精品久久久久久久| 91小视频在线播放| 最新中文字幕免费视频| 无码人妻精品一区二区三区在线| 97av中文字幕| gogogo免费高清日本写真| 黄色手机在线视频| 中文字幕第21页| 777米奇影视第四色| 成人网站免费观看入口| 久久精品久久99| 欧美成年人视频在线观看| 亚洲狼人综合干| 亚洲 中文字幕 日韩 无码| 欧美 国产 综合| 国产午夜福利100集发布| 国产av熟女一区二区三区| 精品国产乱码久久久久久1区二区| 欧美三级理论片| 九热视频在线观看| 在线免费视频a| 成人中文字幕av| 免费激情视频在线观看| 黄色一级二级三级| 天堂社区在线视频| 欧美三级理论片| 日韩精品视频一二三| 亚洲精品自拍网| 在线观看国产一级片| 中文字幕资源在线观看| 日韩av加勒比| 少妇高潮大叫好爽喷水| 在线观看av的网址| 妞干网视频在线观看| 日韩一级片免费视频| 国产精品自拍片| 大j8黑人w巨大888a片| 欧美视频在线观看网站| 日本在线xxx| 黄色国产精品视频| 无限资源日本好片| 亚洲一区二区图片| 五月天av影院| 欧美在线一区视频| 丁香六月激情婷婷| 国产aaa一级片| 一区二区三区 日韩| 超碰91在线播放| 男女裸体影院高潮| 国产精品后入内射日本在线观看| 日av中文字幕| 97人人爽人人| 国产精品av免费观看| 免费高清一区二区三区| 黄色a级片免费| 一二三级黄色片| 亚洲小视频在线播放| 免费成人午夜视频| 久久这里只精品| 国产精品久久久影院| 国产极品在线视频| 9l视频白拍9色9l视频| 精品国产无码在线| 国产91在线免费| 亚洲午夜精品一区| 久草免费福利在线| 亚洲精品一二三四五区| 免费观看中文字幕|