以前兩篇文章分別介紹了Java8的lambda表達式和默認方法和靜態接口方法。今天咱們繼續學習Java8的新語言特性——方法引用(Method References)。html
在學習lambda表達式以後,咱們一般使用lambda表達式來建立匿名方法。然而,有時候咱們僅僅是調用了一個已存在的方法。以下:java
Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));
在Java8中,咱們能夠直接經過方法引用來簡寫lambda表達式中已經存在的方法。ide
Arrays.sort(stringsArray, String::compareToIgnoreCase);
這種特性就叫作方法引用(Method Reference)。學習
方法引用的標準形式是:類名::方法名
。(注意:只須要寫方法名,不須要寫括號)code
有如下四種形式的方法引用:htm
類型 | 示例 |
---|---|
引用靜態方法 | ContainingClass::staticMethodName |
引用某個對象的實例方法 | containingObject::instanceMethodName |
引用某個類型的任意對象的實例方法 | ContainingType::methodName |
引用構造方法 | ClassName::new |
下面咱們經過一個小Demo來分別學習這幾種形式的方法引用:對象
public class Person { public enum Sex{ MALE,FEMALE } String name; LocalDate birthday; Sex gender; String emailAddress; public String getEmailAddress() { return emailAddress; } public Sex getGender() { return gender; } public LocalDate getBirthday() { return birthday; } public String getName() { return name; } public static int compareByAge(Person a,Person b){ return a.birthday.compareTo(b.birthday); } }
Person [] persons = new Person[10]; //使用匿名類 Arrays.sort(persons, new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return o1.birthday.compareTo(o2.birthday); } }); //使用lambda表達式 Arrays.sort(persons, (o1, o2) -> o1.birthday.compareTo(o2.birthday)); //使用lambda表達式和類的靜態方法 Arrays.sort(persons, (o1, o2) -> Person.compareByAge(o1,o2)); //使用方法引用 //引用的是類的靜態方法 Arrays.sort(persons, Person::compareByAge);
class ComparisonProvider{ public int compareByName(Person a,Person b){ return a.getName().compareTo(b.getName()); } public int compareByAge(Person a,Person b){ return a.getBirthday().compareTo(b.getBirthday()); } } ComparisonProvider provider = new ComparisonProvider(); //使用lambda表達式 //對象的實例方法 Arrays.sort(persons,(a,b)->provider.compareByAge(a,b)); //使用方法引用 //引用的是對象的實例方法 Arrays.sort(persons, provider::compareByAge);
String[] stringsArray = {"Hello","World"}; //使用lambda表達式和類型對象的實例方法 Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2)); //使用方法引用 //引用的是類型對象的實例方法 Arrays.sort(stringsArray, String::compareToIgnoreCase);
public static <T, SOURCE extends Collection<T>, DEST extends Collection<T>> DEST transferElements(SOURCE sourceColletions, Supplier<DEST> colltionFactory) { DEST result = colltionFactory.get(); for (T t : sourceColletions) { result.add(t); } return result; } ... final List<Person> personList = Arrays.asList(persons); //使用lambda表達式 Set<Person> personSet = transferElements(personList,()-> new HashSet<>()); //使用方法引用 //引用的是構造方法 Set<Person> personSet2 = transferElements(personList, HashSet::new);