java8新特性-方法引用

方法引用(method references)

方法引用表示可以使用某个方法来作为参数,用::关键字来表示

分为三类

  1. 实例方法引用
  2. 静态方法引用
  3. 构造方法引用

1.实例方法引用

先抽象一个接口和一个实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package me.momotime.java8.methodrefences;
/**
* @author momo.
*/
public interface HelloJava {
public void sayHello();
}
// ----------- 实现类----------------
package me.momotime.java8.methodrefences;
public class HelloJava8 implements HelloJava{
//实现接口中的方法
@Override
public void sayHello(){
System.out.println("hello method");
}
}

在测试类中,定义了一个方法,入参是上面定义的HelloJava类型,但是在main方法中,调用的时候,传统的方式是testMethod(helloJava8);但是我们可以不传入对象,传入方法testMethod(helloJava8::sayHello);,这就是实例方法引用,只要方法的签名和返回值一致,java8能够推断出我们想要调用的方法

1
2
3
4
5
6
7
8
9
10
11
package me.momotime.java8.methodrefences;
public class Test {
public static void main(String args[]) {
HelloJava helloJava8 = new HelloJava8();
testMethod(helloJava8::sayHello);
}
// 用来测试,参数是 HelloJava接口
public static void testMethod(HelloJava helloJava8) {
helloJava8.sayHello();
}
}

2.静态方法引用

在签名的HelloJava8类中,添加一个额外的静态方法,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package me.momotime.java8.methodrefences;
/**
* @author momo.
*/
public class HelloJava8 implements HelloJava{
@Override
public void sayHello(){
System.out.println("hello method");
}
// static method
public static void sayMethod(){
System.out.println("I'm a static method");
}
}

在测试类中,可以直接引用这个静态方法testMethod(HelloJava8::sayMethod);

1
testMethod(HelloJava8::sayMethod);

3.构造方法引用

再写一个类,这个类不实现HelloJava8接口,只有一个构造函数

1
2
3
4
5
6
7
8
9
10
package me.momotime.java8.methodrefences;
/**
* @author momo.
*/
public class HelloJavaNew {
// 构造函数
public HelloJavaNew() {
System.out.println("I'm Constructors");
}
}

使用HelloJavaNew::new来引用构造函数

1
testMethod(HelloJavaNew::new);

输出结果

三个方法都能正常输出,说明方法引用是正确的

1
2
3
hello method
I'm a static method
I'm Constructors