Java - 作为参数的函数

时间:2011-12-24 09:05:23

标签: java

我阅读了关于passing function as parameter的下一个答案。

尽管如此,我还是不明白。我的函数可以得到任何函数:sin(x),cos(x)等。

据我了解,我可以创建一个界面,例如:

public interface functionI<T> {

}

将包装它。

现在我有我的功能:

    public void needToDo(functionI<Integer> a, int x0Par, int hPar){
}

(needToDo,例如,需要替换函数n x0par和hPar的x,并找到Max。如果我得到sin(x),我需要找到sin(x0Par)和(sin()的最大值HPAR))。

我不明白我在我的功能中如何使用它。当我得到函数时,我怎么知道该怎么做,可以是任何东西(多项式,sin(x)等)

2 个答案:

答案 0 :(得分:5)

这样的事情:

public interface Function1<RESULT,INPUT> {
    RESULT call(INPUT input);
}

public class Sin implements Function1<Double,Double> {
    public static final Sin instance = new Sin();
    private Sin() {
    }
    public Double call(Double x) {
        return Math.sin(x);
    }
}

public Double needToDo(Function1<Double,Double> aFunction, Double x0Par, Double hPar) {
   Double d1 = aFunction.call(x0Par);
   Double d2 = aFunction.call(hPar);
   return d1 > d2 ? d1 : d2;
}

public static void main(String[] args) {
    Double x0Par = 10.2;
    Double hPar = 1.9;
    Double ret = needToDo(Sin.instance, x0Par, hPar);
    System.out.println(ret);
}

答案 1 :(得分:3)

它不是那样的工作;你不能将任意函数作为参数传递给Java,而是传递具有特定的,通常是通用的声音函数的对象。

所以你可以定义一个MathOperation接口,它有一个execute方法,取一个double并返回一个double。

public interface MathOperation {
  double execute(double x);
}

然后你可以创建

public class Sin implements MathOperation {
  public double execute(double x) { return Math.sin(x); }
}

并有一个像

一样使用它的功能
public void needToDo(MathOperation op, double x) {
  System.out.println(op.execute(x));
}

您可以为needToDo创建一个即时功能

...
needToDo(new MathOperation() {
    public double execute(double x) { return x * 2.0; }
});
...

但您无法将Math.sin作为参数传递。你可以做一些反思技巧,但这是另一个问题。