java8方法引用符合_java8,方法引用
當(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中文乱码 寮犱笁_MySQL命令
- 下一篇: java房源信息管理的代码_crawle