Java中函数引用:如何引用无参无返回值的public void myMethod()方法
获取Java无参无返回值方法的引用
嘿,这个需求在Java里其实很容易实现,核心就是利用函数式接口和方法引用语法。咱们一步步来拆解:
1. 匹配方法签名的函数式接口
首先,你的public void myMethod()是无参数、无返回值的方法,所以需要找一个抽象方法签名完全匹配的函数式接口。Java内置的Runnable接口正好符合——它的run()方法就是void run(),完美适配。当然你也可以自定义函数式接口,咱们后面说。
2. 获取方法引用的两种场景
根据myMethod是静态方法还是实例方法,获取方式略有不同:
场景一:myMethod是静态方法
直接用类名::方法名的语法就能拿到引用:
public class MyClass { // 静态目标方法 public static void myMethod() { System.out.println("执行静态myMethod"); } public static void main(String[] args) { // 获取静态方法的引用,赋值给Runnable Runnable staticMethodRef = MyClass::myMethod; // 调用方法引用(本质是调用run(),会触发myMethod执行) staticMethodRef.run(); } }
场景二:myMethod是实例方法
需要先创建类的实例,再用实例对象::方法名获取引用:
public class MyClass { // 实例目标方法 public void myMethod() { System.out.println("执行实例myMethod"); } public static void main(String[] args) { MyClass myInstance = new MyClass(); // 获取实例方法的引用 Runnable instanceMethodRef = myInstance::myMethod; // 调用方法引用 instanceMethodRef.run(); } }
3. 自定义函数式接口(可选)
如果你不想用内置的Runnable,可以自己定义一个符合签名的函数式接口,加上@FunctionalInterface注解(可选但推荐,能帮你检查是否符合函数式接口规范):
@FunctionalInterface public interface MyVoidAction { // 抽象方法签名和myMethod完全匹配 void execute(); }
然后同样的方式获取引用:
// 静态方法场景 MyVoidAction staticRef = MyClass::myMethod; staticRef.execute(); // 实例方法场景 MyClass instance = new MyClass(); MyVoidAction instanceRef = instance::myMethod; instanceRef.execute();
补充:方法引用和Lambda的关系
其实方法引用是Lambda表达式的语法糖,上面的代码也可以用Lambda代替,比如:
Runnable lambdaRef = () -> myInstance.myMethod();
但方法引用的写法更简洁直观,尤其是当方法名本身有语义的时候。
内容的提问来源于stack exchange,提问作者user5327287
相关产品推荐
相关产品推荐

