2017/7/5
轉載寫明出處:http://www.cnblogs.com/daren-lin/p/java-method-reference.html
今天要說的是java中的一項新特性,方法引用,method reference。方法引用完全可以用lambda來代替,不會根本不影響平時的開發,但是如果學會了方法引用的話,可以裝逼!
本文按照官方文檔的例子來解釋。
方法引用(method reference)
方法引用只是lambda表達式的拓展,如果不了解lambda表達式,請先閱讀本文:java語言中的匿名類與lambda表達式介紹與總結
有時候lambda表達式只是調用了一個已經申明過的方法,為了增加可讀性(zhuang bi)和進一步簡化,可以使用方法引用。
下面的例子可以很好說明方法引用的使用情形
例子:如果想要按照年齡(age)來給人(Person)排序
有一個Person的數組 rosterAsArray。首先我們實現一個 Comparator,然后使用Arrays.sort來排序
1 Person[] rosterAsArray = roster.toArray(new Person[roster.size()]); 2 3 class PersonAgeComparator implements Comparator<Person> { 4 public int compare(Person a, Person b) { 5 return a.getBirthday().compareTo(b.getBirthday()); 6 } 7 } 8 9 Arrays.sort(rosterAsArray, new PersonAgeComparator());
這里我們看到Comparator實際上是個函數接口(functional interface),所以直接用lambda來簡化
1 Arrays.sort(rosterAsArray, 2 (Person a, Person b) -> { 3 return a.getBirthday().compareTo(b.getBirthday()); 4 } 5 );
假設Person中已經存在一個static的方法 Person.compareByAge 來比較兩個人的年齡,那么我們可以寫成如下
1 Arrays.sort(rosterAsArray, 2 (a, b) -> Person.compareByAge(a, b) 3 );
這個時候我們發現,實際上這個lambda只是調用了已經存在的一個函數compareByAge,那么我們就可以用方法引用了,我們可以寫成更簡單的形式:
1 Arrays.sort(rosterAsArray, Person::compareByAge);
一行搞定!
4種不同類型的方法引用
很直接,我就不做說明直接上表格了
| 類型 | 例子 |
|---|---|
| static方法的引用 | ContainingClass::staticMethodName |
| 特定對象的方法的引用 | containingObject::instanceMethodName |
| 特定類型的方法的引用 | ContainingType::methodName |
| 構造器的引用 | ClassName::new |
參考
https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html
