2012-03-01 86 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语法)