1.概述
方法引用(Method Reference)是lambda表達式的一種特殊形式,如果正好有某個方法滿足一個lambda表達式的形式,那就可以將這個lambda表達式用方法引用的方式表示,但是如果這個lambda表達式的比較復雜就不能用方法引用進行替換。實際上方法引用是lambda表達式的一種語法糖。
方法引用通過方法的名字來指向一個方法。方法引用可以使語言的構造更緊湊簡潔,減少冗余代碼。方法引用使用一對冒號 :: 。
方法引用共分為四類:
1.類名::靜態方法名
2.對象::實例方法名
3.類名::實例方法名
4.類名::new
入門案例:
public class MethodReferenceTest { static void printStr(Consumer<String> c, String s) { // 借助Consumer接口,accept方法可以接收參數 c.accept(s); } public static void main(String[] args) { printStr(s -> System.out.println(s), "Lambda寫法"); // 使用方法引用的前提: // |--對象已經存在(System.out) // |--方法也存在(println()) // |--參數是方法可接收類型(String) printStr(System.out::println, "方法引用:連參數都不寫"); } }
控制台輸出:
Lambda寫法
方法引用:連參數都不寫
2.引用靜態方法
Person實體類
@Data @AllArgsConstructor @NoArgsConstructor public class Person { private String name; private String age; public static int compareByAge(Person a,Person b){ return a.age.compareTo(b.age); } }
案例:
public class MethodReferenceTest { public static void main(String[] args) { Person[] persons = new Person[3]; persons[0]=new Person("lucky","25"); persons[1]=new Person("linda","21"); persons[2]=new Person("peter","28"); //使用匿名類 Arrays.sort(persons, new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return o1.getAge().compareTo(o2.getAge()); } }); //使用lambda表達式 Arrays.sort(persons, (o1, o2) -> o1.getAge().compareTo(o2.getAge())); //使用lambda表達式和類的靜態方法 Arrays.sort(persons, (o1, o2) -> Person.compareByAge(o1,o2)); //使用方法引用 //引用的是類的靜態方法 Arrays.sort(persons, Person::compareByAge); System.out.println(Arrays.toString(persons)); } }
控制台輸出:
[Person(name=linda, age=21), Person(name=lucky, age=25), Person(name=peter, age=28)]
3.引用對象的實例方法
案例:
public class MethodReferenceTest { public static void main(String[] args) { Person[] persons = new Person[3]; persons[0]=new Person("lucky","25"); persons[1]=new Person("linda","21"); persons[2]=new Person("peter","28"); class ComparisonProvider{ public int compareByName(Person a,Person b){ return a.getName().compareTo(b.getName()); } public int compareByAge(Person a,Person b){ return a.getAge().compareTo(b.getAge()); } } ComparisonProvider provider = new ComparisonProvider(); //使用lambda表達式 //對象的實例方法 Arrays.sort(persons,(a,b)->provider.compareByAge(a,b)); //使用方法引用 //引用的是對象的實例方法 Arrays.sort(persons, provider::compareByAge); System.out.println(Arrays.toString(persons)); } }
控制台輸出:
[Person(name=linda, age=21), Person(name=lucky, age=25), Person(name=peter, age=28)]
4.引用類型對象的實例方法
案例:
public class MethodReferenceTest { public static void main(String[] args) { String[] stringsArray = {"Hello","World"}; //使用lambda表達式和類型對象的實例方法 Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2)); //使用方法引用 //引用的是類型對象的實例方法 Arrays.sort(stringsArray, String::compareToIgnoreCase); System.out.println(Arrays.toString(stringsArray)); } }
控制台輸出:
[Hello, World]
參考文獻:
https://www.cnblogs.com/JohnTsai/p/5806194.html----推薦
https://www.cnblogs.com/tigerlion/p/11182864.html
https://www.runoob.com/java/java8-method-references.html
https://blog.csdn.net/wsgytwsgyt/article/details/80273678