Java 8 中我们可以通过 ::
关键字来访问类的构造方法,对象方法,静态方法
先定义一个接口,因为必须要用@FunctionalInterface
修饰,否则编译错误(The target type of this expression must be a functional interface)
@FunctionalInterface
public interface Functional<T,F> {
T convert(F form);
}
public class FunctionalTest {
FunctionalTest() {
}
FunctionalTest(String something) {
System.out.println(something);
}
public static String methodA(String str) {
return str;
}
public String methodB(String str) {
return str;
}
public static void main(String[] args) {
// 获取静态方法
Functional<String, String> convertA = FunctionalTest::methodA;
String convertedA = convertA.convert("test");
// 获取对象方法
Functional<String, String> convertB = new FunctionalTest()::methodB;
String convertedB = convertB.convert("test");
// 获取构造方法
Functional<FunctionalTest, String> convertC = FunctionalTest::new;
FunctionalTest convertedCstru = convertC.convert("test");
}
::
符号相当于实现接口的一种手段,通过::
可以将某个类的方法变为Functionl接口的实现类,但是类方法和接口方法的参数和返回类型一致,@FunctionalInterface
标记的接口只能有一个可实现方法,这样才能保证将对象方法对应到接口方法上,例如 Runnable接口被@FunctionalInterface
标记,它只有一个 Run 方法!!!