将用户定义的java函数作为参数传递

时间:2016-02-04 13:59:29

标签: java interface polymorphism

我有一个名为myFunction的函数,它将列表和函数作为输入,并将该函数应用于列表的每个元素。 示例:

list = {1,2,3}
def square(int x):
     return x*x;
myFunction(list , square) should return {1 ,4, 9}

现在这里是catch,用户可以将任何函数作为输入。我知道这些函数可以包装在接口中并作为参数传递。但就我而言,我不会知道该函数的名称。有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

如果使用Java 8,则可以使用函数(这假定函数返回与其输入参数相同的类型):

public <T> myFunction(T parameter, java.util.function.Function<T, T> funct){
   return funct.apply(parameter);
}

或者,您可以使用函数接口并使用lambda表达式调用它,或者甚至按照其他人的建议调用匿名类:

interface IntDealer{
    int apply(int param);
}
//Thus have your function defined like this:
public int myFunction(int param, IntDealer impl) {
    return impl.apply(int);
}

通过这种方式,您可以使用lambda或匿名类来调用它。

答案 1 :(得分:0)

您可以在Java 8中使用Lambda表达式。

让我们说你的课程A包含你的基本方法

class A{
     int square(int i){
         return i*i
     }
     // other methods (like square root) could here.
}

你可以创建一个类B,它有一个接受另一个方法的方法和一个像这样的列表

class B {
    public List<Integer> myFunction(List<Integer> list, IntConsumer aMethod) {
        List<Integer> sqList=new ArrayList<>()
        for (int i: list){
            sqList.add(aMethod.accept(i))
        }
        return sqList;
    }
}

最后,您可以这样称呼它:

new B().myFunction(list, A::suqare)

new B().myFunction(list, A::suqareRoot)

P.S:代码只是伪代码,您可能需要检查它是否编译。