java8方法引用符合_java8,方法引用
當我們使用lambda表達式去創建一個匿名方法時,有時我們并沒有做什么事情,僅僅是使用了對象中一個存在的方法。這種情況下,通過對象的方法名就能夠很明顯的推斷出要使用 的方法,java8中的方法引用能夠做到這一點。
首先創建一個Person對象。
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對象,想通過生日進行排序,那么傳統的方法是,實現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());
調用的sort方法如下,傳入數組和 實現了Comparator的對象
static void sort(T[] a, Comparator super T> c)
因為Comparator接口是一個函數式接口,所以可以用lambda表達式代替實現了Comparator接口的類對象。
Arrays.sort(rosterAsArray,
(Person a, Person b)->{returna.getBirthday().compareTo(b.getBirthday());
}
);
然而匿名方法是根據生日對Person進行排序,這種方法功能已經在Person類中存在,所以我們可以直接使用lambda表達式調用
Arrays.sort(rosterAsArray,
(a, b)->Person.compareByAge(a, b)
);
因為lambda表達式調用存在的方法,可以使用方法應用代替lambda表達式
Arrays.sort(rosterAsArray, Person::compareByAge);
參數列表從與引用方法參數一致,JRE能夠推斷出方法參數類型,是(Person, Person)
方法體是Person.compareByAge,這樣提高了方法的重用性
引用的方法包括:靜態方法,實例方法,特定類型的任意對象方法引用,構造方法引用
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
引用靜態方法,如上面例子所示
Person::compareByAge
引用實例方法,創建實例,就可以應用對象中的任意方法
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);
特定類型的任意對象方法引用,例如String,和上面引用幾乎相同,只是應用于基本數據類型等
String[] stringArray = { "Barbara", "James", "Mary", "John","Patricia", "Robert", "Michael", "Linda"};
Arrays.sort(stringArray, String::compareToIgnoreCase);
引用構造方法
public static , DEST extends Collection>DEST transferElements(
SOURCE sourceCollection,
SuppliercollectionFactory) {
DEST result=collectionFactory.get();for(T t : sourceCollection) {
result.add(t);
}returnresult;
}
函數式接口Supplier能夠調用無參構造函數,返回一個對象,
Set rosterSetLambda =transferElements(roster, ()-> { return new HashSet<>(); });
也可以使用構造方法引用代替lambda表達式,構造對象
Set rosterSet = transferElements(roster, HashSet::new);
JAVA編譯器能夠推斷出你想創建一個容器,所以可以指定容器包含的類型,如下
Set rosterSet = transferElements(roster, HashSet::new);
總結
以上是生活随笔為你收集整理的java8方法引用符合_java8,方法引用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中文乱码 寮犱笁_MySQL命令
- 下一篇: java房源信息管理的代码_crawle