2016-04-24 207 views
1

我正在编写一个程序,我想知道是否可以将方法作为另一个方法的参数传递。例如,以下内容:有没有办法将方法作为参数传递给方法?

public boolean update(Method m){ //input is a method 
    int i = m.execute(); 
    // logic relating to the value of i 
} 

我想知道我是否可以在java中执行此操作。我目前正在阅读函数式编程和反射。

+1

你能够使用Java 8吗?它增加了对lambda表达式的支持,这使得函数式编程更容易。如果没有,那么反思就是做你要求的方式。 –

+0

我从你的问题中收集,你还没有尝试创建一个简单的程序来尝试它?即使它不起作用,当您编写代码,测试它,并告诉我们结果时,它会提供更好的问题。请参阅http://stackoverflow.com/help/mcve –

+0

是的。 Lambdas非常有用,并且提供了一些Java中的函数编程功能 – Logan

回答

2

这与反射无关,但如果您使用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版本,其版本号为ToIntFunctionToIntBiFunction。超过2个参数,你将不得不添加你自己的功能接口。

0

一种方法是使用接口。在Java中,您可以将一个实现特定接口的对象作为参数传递给一个函数,因此您可以在该对象上调用该方法。 更多现代语言,比如Python,Swift,Javascript,对这个习惯用法有更好的支持。