什么是方法引用
方法引用是lambda表达式升级应用,lambda表达式是对接口的抽象方法的实现,也就是要指出抽象方法要做什么事情,但是如果这个是实现本身就存在一个现成的方法,我们还需要进行实现吗?直接调用就可以了,这就是方法引用,这个方法怎么用?符号用::(双冒号),另外有以下几种类型:
- 通过对象名引用成员方法
- 通过类名称引用静态方法
- 通过 super 引用成员方法
- 通过 this 引用成员方法
- 类的构造器引用
- 类的构造器引用
例子
对接口的实现我们有四种方法,从传统到不传统的方式依次为:
- 创建一个类,实现这个接口
- 匿名内部类
- lambda表达式
- 方法引用(如果有现成的方法的话)
创建一个类,实现这个接口
package mypackage;
@FunctionalInterface
interface Printable {
public abstract void print(String str);
}
class Print implements Printable{
@Override
public void print(String str) {
System.out.println(str);
}
}
//测试
public class MyJava {
public static void main(String[] args) {
Print print = new Print();
print.print("hhhh");
}
}
匿名内部类
package mypackage;
@FunctionalInterface
interface Printable {
public abstract void print(String str);
}
//测试
public class MyJava {
public static void main(String[] args) {
Printable printable = new Printable() {
@Override
public void print(String str) {
System.out.println(str);
}
};
printable.print("hhhh");
}
}
lambda表达式
package mypackage;
@FunctionalInterface
interface Printable {
public abstract void print(String str);
}
//测试
public class MyJava {
public static void main(String[] args) {
Printable printable =(str)->{System.out.println(str);};
printable.print("hhhh");
}
}
方法引用(有现成的方法 System.out.println)
package mypackage;
@FunctionalInterface
interface Printable {
public abstract void print(String str);
}
//测试
public class MyJava {
public static void main(String[] args) {
Printable printable =System.out::println;
printable.print("hhhh");
}
}
方法引用(自己定义的类,内实现静态方法,也算是有现成的方法可引用)
package mypackage;
@FunctionalInterface
interface Printable {
public abstract void print(String str);
}
//自己定义的类,也算是有一个现成的方法可以使用
class MyPrint{
public static void myprint(String str){
System.out.println(str);
}
}
//测试
public class MyJava {
public static void main(String[] args) {
Printable printable =MyPrint::myprint;
printable.print("hhhh");
}
}
关于方法引用和其他类型的方法引用参考一下链接:
Java 1.8 新特性—— 方法引用的详细解释