2009-08-27 16 views
25

在C#中,您可以匿名定义委托(即使它们不过是语法糖)。例如,我可以这样做:Java中C#匿名方法的等价物?

public string DoSomething(Func<string, string> someDelegate) 
{ 
    // Do something involving someDelegate(string s) 
} 

DoSomething(delegate(string s){ return s += "asd"; }); 
DoSomething(delegate(string s){ return s.Reverse(); }); 

是否有可能在Java中像这样传递代码?我正在使用处理框架,它有一个相当老的Java版本(它没有泛型)。

+0

[关于在Java中一般代表A Q](http://stackoverflow.com/questions/44912/java-delegates) – nawfal 2014-07-04 05:11:08

回答

50

前的Java 8其它:

最接近的Java代理是单方法接口。你可以使用一个匿名的内部类。

interface StringFunc { 
    String func(String s); 
} 

void doSomething(StringFunc funk) { 
    System.out.println(funk.func("whatever")); 
} 

doSomething(new StringFunc() { 
     public String func(String s) { 
      return s + "asd"; 
     } 
    }); 


doSomething(new StringFunc() { 
     public String func(String s) { 
      return new StringBuffer(s).reverse().toString(); 
     } 
    }); 

的Java 8.0及以上:

Java 8增加lambda表达式的语言。

doSomething((t) -> t + "asd"); 
    doSomething((t) -> new StringBuilder(t).reverse().toString()); 
+2

[谷歌集合] [1]和Groovy [2]可能会对你感兴趣。 [1] http://code.google.com/p/google-collections/ [2] http://groovy.codehaus.org/ – 2009-08-27 10:49:45

11

不完全像这样,但Java有类似的东西。

它被称为匿名内部类。

让我给你举个例子:

DoSomething(new Runnable() { 
    public void run() { 
     // "delegate" body 
    } 
}); 

这是一个有点冗长,需要一个接口来实现, 但比这几乎是同样的事情

2

是否有可能通过这样的代码 在Java中?我正在使用处理 框架,该框架有一个相当古老的Java版本 (它没有 泛型)。

由于问题是关于处理特定答案的问题,因此没有直接的等价物。但Processing使用Java 1.4语言级别,而Java 1.1引入了匿名内部类,这是一种粗略的近似。

3

你的榜样应该是这样的在Java中,使用anomymous内部类:

interface Func { 
    String execute(String s); 
} 

public String doSomething(Func someDelegate) { 
    // Do something involving someDelegate.execute(String s) 
} 

doSomething(new Func() { public String execute(String s) { return s + "asd"; } }); 
doSomething(new Func() { public String execute(String s) { return new StringBuilder(s).reverse().toString(); } } }); 
2

例如:

public class Delegate 
{ 
    interface Func 
    { 
     void execute(String s); 
    } 

    public static void doSomething(Func someDelegate) { 
     someDelegate.execute("123"); 
    } 

    public static void main(String [] args) 
    { 

     Func someFuncImplementation = new Func() 
     { 
      @Override 
      public void execute(String s) { 
       System.out.println("Bla Bla :" + s); 
      } 
     }; 

     Func someOtherFuncImplementation = new Func() 
     { 
      @Override 
      public void execute(String s) { 
       System.out.println("Foo Bar:" + s); 
      } 
     }; 


     doSomething(someFuncImplementation); 
     doSomething(someOtherFuncImplementation); 
    } 
} 

输出:

喇嘛喇嘛:123

Foo Bar:123

0

你们都忘记了这里,一个C#代表首先 - 是线程安全。 这些示例仅适用于单线程应用程序..

大多数当代应用程序都是用多线程概念编写的。 所以没有人回答是答案。

没有在Java中的等效

+0

这并不是说你所说的是错误的。这是正确的。问题是,这实际上并没有回答被问到的问题 - 它只是说所有其他答案都是错误的。你是说在Java中有*没有*等价物吗? – 2017-08-13 13:59:53

+0

是的,我在说我在说什么.. – 2017-08-13 14:04:40

相关问题