/*
* 方法引用:
* 当Lambda表达式中仅仅调用一个已经存在的方法时,
* 我们就可以使用方法引用代替Lambda表达式。这样
* 可以让程序进一步简洁。
*
* 方法引用分为以下四种:
* 1 引用静态方法
* 2 通过对象(引用)引用实例方法
* 3 通过类型引用实例方法
* 4 引用构造器
*/
public class MethodReference {
public static void main(String[] args) {
Person person1 = new Person("人1", 20, 150, 160);
Person person2 = new Person("人2", 30, 150, 120);
Friend f = (p1, p2) -> Person.makeFriend(p1, p2);
// f.makeFriend(person1, person2);
// 引用静态方法,抽象方法的每个参数会依次传递给
// 所引用的静态方法。
f = Person::makeFriend;
Tools tool = new Tools();
f = (p1, p2) -> tool.makeFriend(p1, p2);
// 通过对象引用实例方法
// 抽象方法的每个参数会依次传递给所引用的实例方法。
f = tool::makeFriend;
f = (p1, p2) -> p1.makeFriend2(p2);
// 通过类型引用实例方法
// 抽象方法第一个参数用来从当所引用实例方法的调用对象。
// 抽象方法的第二个参数起,会依次传递给所引用的实例方法。
f = Person::makeFriend2;
Create c = (name, age, height, weight) -> new Person(name, age, height, weight);
// 引用构造器
//抽象方法的每个参数会依次传递给所引用构造器的参数
c = Person::new;
}
}
@FunctionalInterface
interface Friend {
// 两个人交朋友
void makeFriend(Person p1, Person p2);
}
@FunctionalInterface
interface Create {
Person build(String name, int age, int height, int weight);
}
class Person {
private String name;
private int age;
private int height;
private int weight;
public Person(String name, int age, int height, int weight) {
super();
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public void makeFriend2(Person p) {
//使用当前对象this与参数p交朋友
}
public static void makeFriend(Person p1, Person p2) {
//两个人交朋友的细节
System.out.println("两个人交朋友的细节");
}
}
class Tools {
public void makeFriend(Person p1, Person p2) {
System.out.println("两个人交朋友的细节");
}
}
java方法引用替代lambda表达式
最新推荐文章于 2025-07-04 10:39:05 发布