我阅读了关于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)等)
答案 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
作为参数传递。你可以做一些反思技巧,但这是另一个问题。