我想在java中進行一些數值計算,並且使操作真正模塊化,我希望將函數作爲其他函數的參數傳遞。我正在尋找,通常它是用java來完成的,這個類使用了這個函數。我真的不需要實例化這些類(裏面沒有數據),我想盡可能快地完成它(最終靜態方法由JIT編譯器內聯)。所以我做了這樣的事情將函數作爲Java中的快速數字的靜態類使用
public static class Function2 {
public static float eval(float a, float b){ return Float.NaN; }
}
public static class FAdd extends Function2 {
public static float eval(float a, float b){ return a+b; }
}
public static class Fmult extends Function2 {
public static float eval(float a, float b){ return a*b; }
}
void arrayOp(float [] a, float [] b, float [] out, Function2 func){
for (int i=0; i<a.length; i++){ out[i] = func.eval(a[i], b[i]); }
}
float [] a,b, out;
void setup(){
println(FAdd.eval(10,20));
arrayOp(a,b, out, FAdd);
}
但是它打印錯誤:「找不到類似的東西FADD」當我試圖把它傳遞給arrayOp,即使的println(FAdd.eval(10,20))正常工作。所以看起來由於某種原因,將靜態類作爲參數傳遞是不可能的。
你推薦解決這樣的任務嗎?我真的希望FAdd可以像宏一樣,但是arrayOp是polymorf(取決於我傳入哪個宏)。但理想情況是,如果在編譯時(而不是在運行時)解決它以提高數值速度。編譯結果應該是相同的,如果我會寫
void arrayAdd(float [] a, float [] b, float [] out){
for (int i=0; i<a.length; i++){ out[i] = a[i] + b[i]; }
}
void arrayMult(float [] a, float [] b, float [] out){
for (int i=0; i<a.length; i++){ out[i] = a[i] * b[i]; }
}
函數是在Java中沒有第一類對象,所以這是不可能的與Java <= 7。不確定Java 8.相反,Python或Ruby允許你這樣做。 – Makoto
結果將是一樣的,但它不會像任何需要一樣快。如果性能至關重要,您應該提供最終的個人方法。 –
@Makoto方法將成爲Java 8中的頭等對象,但尚未發佈。 ;) –