首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中如何将函数作为参数传递?

在Java中如何将函数作为参数传递?
EN

Stack Overflow用户
提问于 2011-01-14 05:37:32
回答 5查看 706.8K关注 0票数 478

在Java中,如何将一个函数作为另一个函数的参数传递?

EN

回答 5

Stack Overflow用户

发布于 2011-01-14 05:41:53

您可以使用Java反射来完成此操作。该方法将表示为java.lang.reflect.Method的一个实例。

代码语言:javascript
复制
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);
    }

}
票数 127
EN

Stack Overflow用户

发布于 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的签名:

代码语言:javascript
复制
static boolean exists(java.util.Collection collection, Predicate predicate) 

它接受一个实现接口谓词的对象,这意味着它必须有一个方法,该方法接受某个对象并返回一个布尔值。

所以我可以这样称呼它:

代码语言:javascript
复制
CollectionUtils.exists(someCollection, new Predicate() {
    public boolean evaluate(Object object) { 
        return ("a".equals(object.toString());
    }
});

它返回true或false,这取决于someCollection是否包含谓词返回true的对象。

无论如何,这只是一个例子,commons-collections已经过时了。我只是忘记了在芭乐的等价物。

票数 17
EN

Stack Overflow用户

发布于 2012-09-30 22:02:46

我使用的命令模式是@jk。提到的,添加一个返回类型:

代码语言:javascript
复制
public interface Callable<I, O> {

    public O call(I input);   
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4685563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档