日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java8方法引用符合_java8,方法引用

發(fā)布時(shí)間:2023/12/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java8方法引用符合_java8,方法引用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

當(dāng)我們使用lambda表達(dá)式去創(chuàng)建一個(gè)匿名方法時(shí),有時(shí)我們并沒有做什么事情,僅僅是使用了對(duì)象中一個(gè)存在的方法。這種情況下,通過對(duì)象的方法名就能夠很明顯的推斷出要使用 的方法,java8中的方法引用能夠做到這一點(diǎn)。

首先創(chuàng)建一個(gè)Person對(duì)象。

public classPerson {public enumSex {

MALE, FEMALE

}

String name;

LocalDate birthday;

Sex gender;

String emailAddress;public intgetAge() {//...

}publicCalendar getBirthday() {returnbirthday;

}public static intcompareByAge(Person a, Person b) {returna.birthday.compareTo(b.birthday);

}}

然后有一組person對(duì)象,想通過生日進(jìn)行排序,那么傳統(tǒng)的方法是,實(shí)現(xiàn)Comparator接口

Person[] rosterAsArray = roster.toArray(newPerson[roster.size()]);class PersonAgeComparator implements Comparator{public intcompare(Person a, Person b) {returna.getBirthday().compareTo(b.getBirthday());

}

}

Arrays.sort(rosterAsArray,newPersonAgeComparator());

調(diào)用的sort方法如下,傳入數(shù)組和 實(shí)現(xiàn)了Comparator的對(duì)象

static void sort(T[] a, Comparator super T> c)

因?yàn)镃omparator接口是一個(gè)函數(shù)式接口,所以可以用lambda表達(dá)式代替實(shí)現(xiàn)了Comparator接口的類對(duì)象。

Arrays.sort(rosterAsArray,

(Person a, Person b)->{returna.getBirthday().compareTo(b.getBirthday());

}

);

然而匿名方法是根據(jù)生日對(duì)Person進(jìn)行排序,這種方法功能已經(jīng)在Person類中存在,所以我們可以直接使用lambda表達(dá)式調(diào)用

Arrays.sort(rosterAsArray,

(a, b)->Person.compareByAge(a, b)

);

因?yàn)閘ambda表達(dá)式調(diào)用存在的方法,可以使用方法應(yīng)用代替lambda表達(dá)式

Arrays.sort(rosterAsArray, Person::compareByAge);

參數(shù)列表從與引用方法參數(shù)一致,JRE能夠推斷出方法參數(shù)類型,是(Person, Person)

方法體是Person.compareByAge,這樣提高了方法的重用性

引用的方法包括:靜態(tài)方法,實(shí)例方法,特定類型的任意對(duì)象方法引用,構(gòu)造方法引用

KindExample

Reference to a static method

ContainingClass::staticMethodName

Reference to an instance method of a particular object

containingObject::instanceMethodName

Reference to an instance method of an arbitrary object of a particular type

ContainingType::methodName

Reference to a constructor

ClassName::new

引用靜態(tài)方法,如上面例子所示

Person::compareByAge

引用實(shí)例方法,創(chuàng)建實(shí)例,就可以應(yīng)用對(duì)象中的任意方法

classComparisonProvider {public intcompareByName(Person a, Person b) {returna.getName().compareTo(b.getName());

}public intcompareByAge(Person a, Person b) {returna.getBirthday().compareTo(b.getBirthday());

}

}

ComparisonProvider myComparisonProvider= newComparisonProvider();

Arrays.sort(rosterAsArray, myComparisonProvider::compareByName);

特定類型的任意對(duì)象方法引用,例如String,和上面引用幾乎相同,只是應(yīng)用于基本數(shù)據(jù)類型等

String[] stringArray = { "Barbara", "James", "Mary", "John","Patricia", "Robert", "Michael", "Linda"};

Arrays.sort(stringArray, String::compareToIgnoreCase);

引用構(gòu)造方法

public static , DEST extends Collection>DEST transferElements(

SOURCE sourceCollection,

SuppliercollectionFactory) {

DEST result=collectionFactory.get();for(T t : sourceCollection) {

result.add(t);

}returnresult;

}

函數(shù)式接口Supplier能夠調(diào)用無參構(gòu)造函數(shù),返回一個(gè)對(duì)象,

Set rosterSetLambda =transferElements(roster, ()-> { return new HashSet<>(); });

也可以使用構(gòu)造方法引用代替lambda表達(dá)式,構(gòu)造對(duì)象

Set rosterSet = transferElements(roster, HashSet::new);

JAVA編譯器能夠推斷出你想創(chuàng)建一個(gè)容器,所以可以指定容器包含的類型,如下

Set rosterSet = transferElements(roster, HashSet::new);

總結(jié)

以上是生活随笔為你收集整理的java8方法引用符合_java8,方法引用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。