在Java中,如何将一个函数作为另一个函数的参数传递?
发布于 2011-01-14 05:41:53
您可以使用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);
}
}发布于 2011-01-14 05:40:42
多亏了Java8,你不需要做下面的步骤来把一个函数传递给一个方法,这就是lambdas的作用,参见Oracle's Lambda Expression tutorial。这篇文章的其余部分描述了在过去糟糕的日子里,为了实现这个功能,我们必须做些什么。
通常,您将方法声明为使用单个方法获取某个接口,然后传入一个实现该接口的对象。commons-collections就是一个例子,其中您有用于闭包、Transformer和Predicate的接口,以及传递这些接口实现的方法。Guava是新的改进的commons-collections,你可以在那里找到等价的接口。
例如,commons-collections有org.apache.commons.collections.CollectionUtils,,它有很多接受传入对象的静态方法,要随机选择一个,有一个名为exists的签名:
static boolean exists(java.util.Collection collection, Predicate predicate) 它接受一个实现接口谓词的对象,这意味着它必须有一个方法,该方法接受某个对象并返回一个布尔值。
所以我可以这样称呼它:
CollectionUtils.exists(someCollection, new Predicate() {
public boolean evaluate(Object object) {
return ("a".equals(object.toString());
}
});它返回true或false,这取决于someCollection是否包含谓词返回true的对象。
无论如何,这只是一个例子,commons-collections已经过时了。我只是忘记了在芭乐的等价物。
发布于 2012-09-30 22:02:46
我使用的命令模式是@jk。提到的,添加一个返回类型:
public interface Callable<I, O> {
public O call(I input);
}https://stackoverflow.com/questions/4685563
复制相似问题