Java方法引用
方法引用是JDK8新引入的语法,基于Lambda表达式的基础上进一步精简代码,也可以说是Lambda表达式的语法糖
语法
方法引用使用一对冒号 :: 实现,常见以下四种引用形式:
- • 静态方法引用:类名::静态方法
- • 实例方法引用:对象名::普通方法
- • 构造方法引用:类名::new
- • 对象方法引用:类名::普通方法
使用场景
当Lambda体中调用方法的参数列表与返回值类型,和函数式接口中抽象方法的参数列表及返回值类型一致时可以使用
静态方法引用
当在接口方法实现时要调用一个静态方法,这个静态方法需要的参数和接口中方法的参数一致,并且返回值类型也相同
public class StaticMain {
public static void main(String[] args) {
// Lambda版本,只有一行代码直接简写,调用静态方法
IStaticMethod staticMethod = num -> StaticMain.innerStaticMethod(num);
// 调用接口实现方法
staticMethod.get(1024);
}
// 方法引用版本,类名::静态方法
IStaticMethod staticMethod = StaticMain::innerStaticMethod;
// 静态方法,返回值类型和参数列表与调用它的方法一致
static void innerStaticMethod(Integer num) {
System.out.println("静态方法......" + num);
}
}
实例方法引用
public class InstanceMain {
public static void main(String[] args) {
// 创建Person对象
Person person = new Person(1L,"添甄");
// 1、Lambda表达式实现
IInstanceMethod iInstanceMethod1 = () -> person.getName();
// 调用接口的get方法
System.out.println(iInstanceMethod1.getInstanceName());
//2、实例方法引用,首先要有实例吧。new出来的person就是一个实例
IInstanceMethod instanceMethod2 = person::getName;
System.out.println(instanceMethod2.getInstanceName());
}
}
构造方法引用
public class ConstructorMain {
public static void main(String[] args) {
// 1、Lambda实现
IConstructorInterface constructor1 = () -> new Person();
// 获取Person实例
Person person1 = constructor1.getPerson();
// 2、方法引用实现
IConstructorInterface constructor2 = Person::new;
// 获取Person实例
Person person2 = constructor2.getPerson();
}
}
对象方法引用
public class ObjectMain {
public static void main(String[] args) {
// 1、匿名内部类实现
IObjectInterface objectInterface1 = new IObjectInterface() {
@Override
public String getPersonName(Person person) {
return person.getName();
}
};
String innerResult = objectInterface1.getPersonName(new Person(1L, "InnerClass"));
System.out.println(innerResult);
// 2、Lambda实现
IObjectInterface objectInterface2 = (person) -> person.getName();
String lambdaResult = objectInterface2.getPersonName(new Person(2L, "Lambda"));
System.out.println(lambdaResult);
// 3、对象方法引用
IObjectInterface objectInterface3 = Person::getName;
String objectResult = objectInterface3.getPersonName(new Person(3L,"对象方法引用"));
System.out.println(objectResult);
}
}