本文主要描述一下什么是方法引用以及方法引用的四種表現(xiàn)形式
方法引用是Lambda表達(dá)式的一種語法糖
我們可以將方法引用看做是一個函數(shù)指針
-
方法引用共分為4類:
- 類名::靜態(tài)方法名
- 對象名::實例方法名
- 類名::實例方法名
- 構(gòu)造方法引用 類名:new
使用場景:Lambda表達(dá)式只有一行代碼醒颖,并且有現(xiàn)成的可以替換
1. 類名::靜態(tài)方法名:
public class Student {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public static int compareStudentByScore(Student s1, Student s2) {
return s1.score - s2.score;
}
}
根據(jù)學(xué)生的分?jǐn)?shù)進(jìn)行排序
Lambda表達(dá)式的參數(shù)個數(shù)與類型正好和當(dāng)前類的某個唯一方法需要的參數(shù)個數(shù)類型完全一致,此時可以用這種方法來替換Lambda表達(dá)式
Student s1 = new Student("zhangsan", 12);
Student s2 = new Student("lisi", 60);
Student s3 = new Student("wangwu", 40);
Student s4 = new Student("zhaoliu", 90);
List<Student> list = Arrays.asList(s1, s2, s3, s4);
//使用Lambda表達(dá)式的方式
list.sort((student1, student2) -> Student.compareStudentByScore(student1, student2));
/**
* 類名::靜態(tài)方法名
*/
list.sort(Student::compareStudentByScore);
2. 對象名::實例方法名
public class StudentCompartor {
public int compareStudentByScore(Student s1, Student s2) {
return s1.getScore() - s2.getScore();
}
}
Lambda表達(dá)式的參數(shù)個數(shù)與類型正好和當(dāng)前對象的某個唯一方法需要的參數(shù)個數(shù)類型完全一致,此時可以用這種方法來替換Lambda表達(dá)式
StudentCompartor studentCompartor = new StudentCompartor();
//Lambda表達(dá)式方式
list.sort((student1, student2) -> studentCompartor.compareStudentByScore(student1, student2));
/**
* 對象名::實例方法名
*/
list.sort(studentCompartor::compareStudentByScore);
3. 類名::實例方法名
public class Student {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int compareByScore(Student student) {
return this.getScore() - student.getScore();
}
}
使用 類名::實例方法名 這種方式能夠替換的Lambda表達(dá)式形式為:
Lambda表達(dá)式接收的第一個參數(shù)為當(dāng)前類的對象,后面的參數(shù)依次為該對象中的某個方法接受的參數(shù)局冰。此例中 Lambda表達(dá)式是(o1,o2)->o1.compareByScore(o2)
正好符合轉(zhuǎn)換
//Lambda表達(dá)式方式
list.sort((o1,o2)->o1.compareByScore(o2));
/**
* 類名::實例方法名
*/
list.sort(Student::compareByScore);
4. 構(gòu)造方法引用 類名:new
需要調(diào)用的構(gòu)造器的參數(shù)列表需要與函數(shù)式接口中抽象方法的函數(shù)列表保持一致闯传。
System.out.println("----------lambda表達(dá)式---------");
Supplier<Student> supplier = () -> new Student();
System.out.println(supplier.get());
System.out.println("-----------使用方法的引用----------");
Supplier<Student> supplier1 = Student::new;
System.out.println(supplier1.get());