目录
什么是方法引用
首先,这个东西是用来简化或者说替代Lambda表达式的。如果Lambda要表达的函数方案已经存在于某个方法实现中,则可以通过双冒号来引用该方法作为Lambda的替代者(因此必须要有函数式接口)
printString(System.out::println)
通过对象名引用成员方法
使用前提是对象名是已经存在的,成员方法也是已经存在的
@FunctionalInterface
public interface Printable {
void print(String s);
}
public class MethodRerObject {
public void printUpperCaseString(String str){
System.out.println(str.toUpperCase());
}
}
public class DemoReference {
public static void printString(Printable p){
p.print("Hello");
}
public static void main(String[] args) {
printString((s)->{
MethodRerObject obj = new MethodRerObject();
printString(obj::printUpperCaseString);
});
}
}
通过类名引用静态成员方法
使用前提是类已经存在,并且静态成员方法也已经存在
@FunctionalInterface
public interface Calcable {
int calsAbs(int number);
}
public class DemoReference {
public static int method(int number,Calcable c){
return c.calsAbs(number);
}
public static void main(String[] args) {
int number2 = method(-10,Math::abs);
System.out.println(number2);
}
}
通过super关键字调用父类的成员方法
使用前提是super继承关系存在,父类的成员方法sayHello也存在。
method(super::sayHello);
通过this关键字来调用本类成员方法
使用前提是this已经存在,本类的成员方法也存在
marry(this::buyHouse);
通过类的构造器(构造方法)引用
类的构造方法已知,就可以通过类的构造器引用new创建对象
printName("娜扎",Person::new);
数组的构造器引用
已知数组的长度和数组的类型,可以通过引用来创建数组
int[] arr2 = createArray(10,int[]::new);