Java學習筆記-方法引用,java學習筆記引用

來源:互聯網
上載者:User

Java學習筆記-方法引用,java學習筆記引用
方法引用(Method Reference)

上一篇中記錄了Lambda運算式,其可以建立匿名方法。當Lambda運算式只是調用一個存在的方法時,可以採用方法引用(JDK8具有的特性)。如下:

 1 public class Person { 2  3     public enum Sex { 4         MALE, FEMALE 5     } 6  7     String name; 8     LocalDate birthday; 9     Sex gender;10     String emailAddress;11     int age;12 13     public int getAge() {14         return age;15     }16     17     public LocalDate getBirthday() {18         return birthday;19     }    20 21     public static int compareByAge(Person a, Person b) {22         return a.birthday.compareTo(b.birthday);23     }24 } 

假設需要對一組人員按年齡進行排序,可以採用下邊的方式,將人員數組與實現的比較子,傳遞給Array.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()); 

當然,可以將PersonAgeComparator的實現採用Lambda運算式,如下:

1  Arrays.sort(rosterAsArray, (a,b) -> a.birthday.compareTo(b.birthday)); 

Person類中已經包含根據年齡的比較compareByAge,只需要在Lambda運算式體中直接調用即可

1 Arrays.sort( rosterAsArray, (a,b) -> Person.compareByAge(a,b)); 

由於Lambda運算式調用一個已經存在的方法,可以使用方法引用代替Lambda運算式,如下:

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

其中 ,Person::compareByAge 與 (a, b) -> Person.compareByAge(a, b)是等價的。(1)其參數拷貝於Comparator<Person>.compare,即 (Person, Person);(2)body將調用Person.compareByAge。

方法引用類別

有4種方法引用,如下:

  • 引用靜態方法,如 ContainingClass::staticMethodName;
  • 引用執行個體方法,如 containingObject::instanceMethodName;
  • 引用特殊類型對象的方法,如 ContainingType::methodName;
  • 引用建構函式,如 ClassName::new。
(1)引用靜態方法

上文中的例子即為靜態方法引用。

(2)引用執行個體方法

即通過類的執行個體引用方法,如下:

 1 class ComparisonProvider { 2     public int compareByName(Person a, Person b) { 3         return a.getName().compareTo(b.getName()); 4     } 5          6     public int compareByAge(Person a, Person b) { 7         return a.getBirthday().compareTo(b.getBirthday()); 8     } 9 }10 ComparisonProvider myComparisonProvider = new ComparisonProvider();11 Arrays.sort(rosterAsArray, myComparisonProvider::compareByName); 
(3)引用特殊類型對象的方法

以String為例:

1 String[] stringArray = { "Barbara", "James", "Mary", "John",2     "Patricia", "Robert", "Michael", "Linda" };3 Arrays.sort(stringArray, String::compareToIgnoreCase); 
(4)引用建構函式

假設transferElements實現從一個集合到另一個集合拷貝元素,如下:

 1 public static <T, SOURCE extends Collection<T>, DEST extends Collection<T>> 2     DEST transferElements( 3         SOURCE sourceCollection, 4         Supplier<DEST> collectionFactory) { 5          6         DEST result = collectionFactory.get(); 7         for (T t : sourceCollection) { 8             result.add(t); 9         }10         return result;11 } 

其中Supplier包含一個get方法,只返回一個空的集合對象,並且不需要任何參數,可以使用Lambda運算式實現,如下:

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

此時可以採用引用建構函式的方法,如下:

Set<Person> rosterSet = transferElements(roster, HashSet::new);//或Set<Person> rosterSet = transferElements(roster, HashSet<Person>::new); 
總結
  • 對於Lambda運算式,當只是調用一個已存在的方法時,可以採用方法引用的方式實現,編譯器會自行翻譯
參考

       Method references

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.