有没有办法将方法作为参数传递给方法?
问题描述:
我正在编写一个程序,我想知道是否可以将方法作为另一个方法的参数传递。例如,以下内容:有没有办法将方法作为参数传递给方法?
public boolean update(Method m){ //input is a method
int i = m.execute();
// logic relating to the value of i
}
我想知道我是否可以在java中执行此操作。我目前正在阅读函数式编程和反射。
答
这与反射无关,但如果您使用java 8 +,则可以传递“方法引用”。从你的例子假设你打算使用不带参数,只是返回一个int的方法,你可以这样做:
public class MyClass {
public int getIntMemberFunction(){ ... }
public static int getIntStaticFunction(){ ... }
}
与修改成这个样子你的更新功能,
public boolean update(IntSupplier s){ //input is a method reference or lambda
int i = s.get();
// logic relating to the value of i
}
然后你可以调用update
传递一个参考任何静电功能上的任何类,只要它不带任何参数,并返回一个int,像这样:
boolean result = update(MyClass::getIntStaticFunction);
或y欧可致电update
传递到只要一个特定对象的成员函数的一个参考,因为它不带任何参数,并返回一个int,像这样:
MyClass myClassInstance = ...
boolean result = update(myClassInstance::getIntMemberFunction);
如果你想补充一点,取1个或2个参数的方法,您可以创建update
版本,其版本号为ToIntFunction
或ToIntBiFunction
。超过2个参数,你将不得不添加你自己的功能接口。
答
一种方法是使用接口。在Java中,您可以将一个实现特定接口的对象作为参数传递给一个函数,因此您可以在该对象上调用该方法。 更多现代语言,比如Python,Swift,Javascript,对这个习惯用法有更好的支持。
你能够使用Java 8吗?它增加了对lambda表达式的支持,这使得函数式编程更容易。如果没有,那么反思就是做你要求的方式。 –
我从你的问题中收集,你还没有尝试创建一个简单的程序来尝试它?即使它不起作用,当您编写代码,测试它,并告诉我们结果时,它会提供更好的问题。请参阅http://stackoverflow.com/help/mcve –
是的。 Lambdas非常有用,并且提供了一些Java中的函数编程功能 – Logan