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

将用户定义的java函数作为参数传递,java,interface,polymorphism,Java,Interface,Polymorphism,我有一个名为myFunction的函数,它接受一个列表和一个函数作为输入,并将该函数应用于列表的每个元素。 例如: list = {1,2,3} def square(int x): return x*x; myFunction(list , square) should return {1 ,4, 9} 下面是一个问题,用户可以将任何函数作为输入。我知道函数可以包装在接口中并作为参数传递。但是在我的例子中,我不知道函数的名字。有什么方法可以解决这个问题吗?如果使用Java 8,您可

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

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

下面是一个问题,用户可以将任何函数作为输入。我知道函数可以包装在接口中并作为参数传递。但是在我的例子中,我不知道函数的名字。有什么方法可以解决这个问题吗?

如果使用Java 8,您可以使用一个函数(假设该函数返回的类型与其输入参数相同):


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

您可以在Java8中使用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;
    }
}


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

@Satya我通过创建接口将方法作为函数参数传递。然后这个接口由需要这个函数作为另一个函数参数的类实现。但是现在情况不同了,函数是用户定义的。根据用户的需要,功能每次都可以更改。他可能想要平方,或者取平方根等等。我赞成删除java标记,因为示例代码看起来很像python。@xXliolauXx Relax,这只是我想做的一个示例。您不能简单地丢弃java标记,因为接口是用java实现的,用于传递函数
class A{
     int square(int i){
         return i*i
     }
     // other methods (like square root) could here.
}
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)