2011-12-24 46 views
2

我讀了關於passing function as parameter的下一個答案。Java - 作爲參數

不過,我不明白。我的函數可以得到任何功能:SIN(X),COS(X)等

我的理解,我可以創建一個接口,例如:

public interface functionI<T> { 

} 

,將包裹。

現在我有我的功能:

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

(needToDo,例如,需要substitue函數n x0par和HPAR的x,並找到最大。如果我得到的sin(x),I。需要找到sin(x0Par)和(sin(hPar))的最大值。

我不明白我是如何在我的函數中使用它的,我怎麼知道當我得到函數時該怎麼做,是什麼(多項式,sin(x)等)

+3

您的界面目前沒有任何方法,這是一個問題...我們不知道'needToDo'意味着要實現什麼...... – 2011-12-24 09:08:32

+0

@JonSkeet我編輯它。 – 2011-12-24 09:12:02

+0

看到這篇文章http://stackoverflow.com/questions/2186931/java-pass-method-as-parameter – 2011-12-24 09:12:20

回答

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); 
} 
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作爲參數。有可以做的反射技巧,但那是另一個問題。