Java中C#匿名方法的等价物?

时间:2009-08-27 10:38:08

标签: java c# delegates processing anonymous-function

在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(它没有泛型)。

6 个答案:

答案 0 :(得分:58)

Pre 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及以上版本:

Java 8将lambda表达式添加到语言中。

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

答案 1 :(得分:12)

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

它被称为匿名内部类。

让我举个例子:

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

它有点冗长,需要一个接口来实现, 但除此之外它几乎是一样的

答案 2 :(得分:3)

您的示例在Java中使用匿名内部类:

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(); } } });

答案 3 :(得分:2)

  

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

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

答案 4 :(得分:2)

例如:

ImportError: No module named cryptography.hazmat.bindings._openssl

输出:

  Bla Bla:123

     

Foo Bar:123

答案 5 :(得分:0)

你们都忘记了首先是C#代理 - 线程安全。 这些示例仅适用于单个线程App ..

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

Java中没有等效的