如何将方法作为参数传进方法里?| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>

如何将方法作为参数传进方法里?

使用Java8的lambda表达式,如果你有一个类或接口,只需要一个抽象方法就能办到,例如:

public interface MyInterface {
    String doSomething(int param1, String param2);
}
复制代码

在任何使用MyInterface的地方,你都可以使用一个lambda表达式替代它

class MyClass {
    public MyInterface myInterface = (p1, p2) -> { return p2 + p1; };
}
复制代码

比如说你可以快速创建一个多线程

new Thread(() -> someMethod()).start();
复制代码

或者使用方法引用语法使其更加清晰

new Thread(this::someMethod).start();
复制代码

如果没有lambda语法的话,这两个例子就会变成这样子:

new Thread(new Runnable() { someMethod(); }).start();
复制代码

在Java8之前如何处理?

一个常见的模式是将其包装到接口中,例如Callable接口,之后你就可以把包装了方法的Callable接口传进方法里了。

public T myMethod(Callable<T> func) {
    return func.call();
}
复制代码

这种模式称为命令模式

请记住,你最好为你的特定用途创建一个接口,如果你选择使用callable接口,你就需要使用泛型,例如Callable<String>

下面是我写一个详细的例子:

public int methodToPass() { 
        // do something
}

public void dansMethod(int i, Callable<Integer> myFunc) {
       // do something
}
复制代码

然后用一个匿名内部类调用它

dansMethod(100, new Callable<Integer>() {
   public Integer call() {
        return methodToPass();
   }
});
复制代码

请记住这并不是什么花里胡哨的用法,它是Java的基本概念,等同于函数指针。

回答二

你可以使用反射来实现,下面是java.lang.reflect.method的一个实例

import java.lang.reflect.Method;

public class Demo {

    public static void main(String[] args) throws Exception{
        Class[] parameterTypes = new Class[1];
        parameterTypes[0] = String.class;
        Method method1 = Demo.class.getMethod("method1", parameterTypes);

        Demo demo = new Demo();
        demo.method2(demo, method1, "Hello World");
    }

    public void method1(String message) {
        System.out.println(message);
    }

    public void method2(Object object, Method method, String message) throws Exception {
        Object[] parameters = new Object[1];
        parameters[0] = message;
        method.invoke(object, parameters);
    }

}
复制代码

回答三

Java支持闭包,它只是不支持函数,所以用于闭包的语法就显得更为笨拙和庞大:你必须把所有内容包装到类中,例如:

public Runnable foo(final int x) {
  return new Runnable() {
    public void run() {
      System.out.println(x);
    }
  };
}
复制代码

文章翻译自Stack Overflow:stackoverflow.com/questions/4…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享