方法引用
标准语法为 Classname::methodName
需要注意的是,虽然这是一个方法,但不需要在后面加括号,因为这里并不调用该方法。
我们只是提供了和 Lambda 表达式等价的一种结构, 在需要时才会调用。
凡是使用 Lambda 表达式的地方,就可以使用方法引用。
1、方法引用符
双冒号::
为引用运算符,而他所在的表达式被称为方法引用。如果Lambda要表达的函数方案已经存在与某个方法的实现中,那么则可以通过双冒号来引用该方法作为Lambda的替代者。
2、通过对象名引用成员方法
interface A{
void printS(String s);
}
public static void method(A s){ s.printS("你好呀");}
public static void main(String[] args) {
method(s-> System.out.println(s));
method(System.out::println);
}
语义分析
- Lambda表达式写法:
method(s-> System.out.println(s));
拿到参数之后经Lambda之手,继而传给
System.out.println
方法处理
- 方法引用写法:
method(System.out::println);
之恶让
System.out
中的println
方法来取代Lambda。两种写法执行效果完全一样,而第二种方法引用的写法复用了已有的方法,更加简洁。
3、通过类名引用静态方法
interface MyInterface{
int myAbs(int a);
}
public class demo01 {
public static int method(int a,MyInterface myInterface){
return myInterface.myAbs(a);
}
public static void main(String[] args) {
int method = method(-10, (a) -> Math.abs(a));
System.out.println(method);
/*
Math类是存在的
abs静态方法也是存在的
所以可以通过类名引用静态方法
*/
//方法引用
int method1 = method(-10, Math::abs);
System.out.println(method1);
}
}
4、通过super引用成员方法
如果存在继承关系,当Lambda表达式中需要出现super调用时,也可以使用方法引用进行代替
@FunctionalInterface
interface Inter{
void sick();
}
class I{
public void say(){
System.out.println("多喝热水");
}
}
class Friend extends I {
@Override
public void say(){
System.out.println("???");
}
public void method(Inter i){
i.sick();
}
public void show(){
/*method(()->{
I f = new I();
f.say();
});*/
//method(()-> super.say());
//方法引用
/*
使用super引用类的成员方法
super是已经存在的
父类成员方法say存在
所以,可以使用
* */
method(super::say);
}
public static void main(String[] args) {
Friend f1 = new Friend();
f1.show();
f1.say();
}
}