2012-03-01 55 views
2

我寫了一些c#代碼,它實現了幾個函數的轉移。我使用它的代表。如何在C#中使用Java代理?

public delegate float Func(float x); 
public Dictionary<string, Func> Functions = new Dictionary<string, Func>(); 

填寫詞典:

Functions.Add("y=x", delegate(float x) { return x; }); 
     Functions.Add("y=x^2", delegate(float x) { return x*x; }); 
     Functions.Add("y=x^3", delegate(float x) { return x*x*x; }); 
     Functions.Add("y=sin(x)", delegate(float x) { return (float)Math.Sin((double)x); }); 
     Functions.Add("y=cos(x)", delegate(float x) { return (float)Math.Cos((double)x); }); 

和我使用這些功能來找到他們的最大和其他一些任務。

private float maxY(params Func[] F) 
    { 
     float maxYi = 0; 
     float maxY = 0; 
     foreach (Func f in F) 
     { 
      for (float i = leftx; i < rightx; i += step) 
      { 
       maxYi = Math.Max(f(i), maxYi); 
      } 
      maxY = Math.Max(maxY, maxYi); 
     } 
     return maxY; 
    } 

我該如何在Java中做到這一點?
我不知道如何在Java中使用委託。

+0

看吧:HTTP:/ /stackoverflow.com/questions/122407/whats-the-nearest-substitute-for-a-function-pointer-in-java - 沒有真正的代表。 – weismat 2012-03-01 10:18:12

+0

哪個版本的java?我相信新版本的java有一些lambda支持,這可能會使代碼更好。 – CodesInChaos 2012-03-01 10:22:17

+0

@CodeInChaos lambda計劃用於尚未發佈的Java 8 ... – assylias 2012-03-01 10:26:45

回答

7

您可以使用一個接口是這樣的:

public static void main(String... args) throws Exception { 
    Map<String, Computable> functions = new HashMap<String, Computable>(); 
    functions.put("y=x", new Computable() {public double compute(double x) {return x;}}); 
    functions.put("y=x^2", new Computable() {public double compute(double x) {return x*x;}}); 

    for(Map.Entry<String, Computable> e : functions.entrySet()) { 
     System.out.println(e.getKey() + ": " + e.getValue().compute(5)); //prints: y=x: 5.0 then y=x^2: 25.0 
    } 
} 

interface Computable { 
    double compute(double x); 
} 
1

Java沒有委託,但是您可以通過僅使用一種方法聲明接口來實現相同的效果。

interface Function { 
    float func(float x); 
} 

Functions.Add("y=x", new Function { public float func(float x) { return x; } }); 

(對不起,可能語法錯誤,我不是很熟悉的Java語法)