本文正在参加「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