Java 8Lambda之方法引用(Method References)

來源:互聯網
上載者:User

標籤:import   方法調用   turn   指定   object   ini   ns2   compare   classname   

方法引用分為4類,方法引用也受到存取控制許可權的限制,可以通過在引用位置是否能夠調用被引用方法來判斷。具體分類資訊如下:

類型 使用方式
靜態方法 ContainingClass::staticMethodName
指定執行個體的方法 containingObject::instanceMethodName
特定類執行個體的任意方法 ContainingType::methodName
構造方法 ClassName::new
 
    • 引用靜態方法 
      ContainingClass::staticMethodName 
      例子: String::valueOf,對應的Lambda:(s) -> String.valueOf(s) 
      比較容易理解,和靜態方法調用相比,只是把.換為::

    • 引用特定對象的執行個體方法 
      containingObject::instanceMethodName 
      例子: x::toString,對應的Lambda:() -> this.toString() 
      與引用靜態方法相比,都換為執行個體的而已

    • 引用特定類型的任意對象的執行個體方法 
      ContainingType::methodName 
      例子: String::toString,對應的Lambda:(s) -> s.toString() 
      太難以理解了。難以理解的東西,也難以維護。建議還是不要用該種方法引用。 
      執行個體方法要通過對象來調用,方法引用對應Lambda,Lambda的第一個參數會成為調用執行個體方法的對象。

    • 引用建構函式 
      ClassName::new 
      例子: String::new,對應的Lambda:() -> new String() 
      建構函式本質上是靜態方法,只是方法名字比較特殊。

一個執行個體:
package methodReference;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.function.Supplier;/** * @author jiangxiulian * @create 2017-12-28 下午12:03 **/public class MethodReference {    public static void main(String args[]){        //引用建構函式        PersonFactory factory = new PersonFactory(Person::new);       // PersonFactory personFactory = new PersonFactory(() ->new Person());        List<Person> personList = new ArrayList<Person>();        Person p1 = factory.getPerson();        p1.setName("Kobe");        personList.add(p1);        Person p2 = factory.getPerson();        p2.setName("James");        personList.add(p2);        Person p3 = factory.getPerson();        p3.setName("Paul");        personList.add(p3);        Person[] persons1 = personList.toArray(new Person[personList.size()]);        System.out.print("排序前");        printArray(persons1);        System.out.println();        //引用靜態方法        Arrays.sort(persons1,MethodReference::myCompare);        System.out.print("排序後");        printArray(persons1);        System.out.println();        Person[] persons2 = personList.toArray(new Person[personList.size()]);        System.out.print("排序前");        printArray(persons2);        System.out.println();        //引用特定對象的執行個體方法        Arrays.sort(persons2,p1::compare);        System.out.print("排序後");        printArray(persons2);        System.out.println();        Person[] persons3 = personList.toArray(new Person[personList.size()]);        System.out.print("排序前");        printArray(persons3);        //  引用特定類型的任意對象的執行個體方法        Arrays.sort(persons3,Person::compareTo);        System.out.print("排序後");        printArray(persons3);    }    public static void printArray(Person[] persons) {        for (Person p : persons) {            System.out.print(p.name + "  ");        }        System.out.println();    }    public static int myCompare(Person p1, Person p2) {        return p1.getName().compareTo(p2.getName());    }    static class Person{        private String name;        public Person(){        }        public String getName() {            return name;        }        public void setName(String name) {            this.name = name;        }        public int compare(Person p1,Person p2){            return p1.getName().compareTo(p2.getName());        }        public int compareTo(Person p){            return this.getName().compareTo(p.getName());        }    }    static class PersonFactory{        private Supplier<Person> supplier;        public PersonFactory(Supplier<Person> supplier){            this.supplier = supplier;        }        public Person getPerson(){            return supplier.get();        }    }}

 




Java 8Lambda之方法引用(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.