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

java c# delegates processing anonymous-function

23211 观看

6回复

在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的较旧版本(它没有泛型)。

作者: Callum Rogers 的来源 发布者: 2019 年 11 月 12 日

回应 (6)


61

决定

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());
作者: Michael Lloyd Lee mlk 发布者: 27.08.2009 10:43

13

并非完全像这样,但是Java也有类似的东西。

它称为匿名内部类。

让我给你举个例子:

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

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

作者: Gregory Mostizky 发布者: 27.08.2009 10:42

4

您的示例在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(); } } });
作者: Jesper 发布者: 27.08.2009 10:48

3

是否可以在Java中传递这样的代码?我正在使用处理框架,该框架具有Java的较旧版本(它没有泛型)。

由于该问题询问有关处理特定问题的答案,因此没有直接对应的问题。但是Processing使用Java 1.4语言级别,并且Java 1.1引入了匿名内部类,这是一个大致的近似。

作者: John Feminella 发布者: 27.08.2009 10:44

3

例如 :

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酒吧:123

作者: JAN 发布者: 11.09.2015 07:44

0

在这里,您都忘记了C#委托首先是线程安全的。这些示例仅适用于单线程应用程序。

大多数现代应用程序都是在多线程概念上编写的。因此,没有人能给出答案。

Java中没有等效项

作者: user8404505 发布者: 10.08.2017 02:20
32x32