Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中C#匿名方法的等价物?_Java_C#_Delegates_Processing_Anonymous Function - Fatal编程技术网

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

Java中C#匿名方法的等价物?,java,c#,delegates,processing,anonymous-function,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

在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(); });
公共字符串DoSomething(Func someDelegate)
{
//执行涉及someDelegate(字符串s)的操作
} 
DoSomething(委托(字符串s){返回s+=“asd”;});
DoSomething(委托(字符串s){返回s.Reverse();});

在Java中可以传递这样的代码吗?我使用的是processing框架,它有一个相当旧的Java版本(它没有泛型)

与此不完全相同,但Java也有类似之处

它被称为匿名内部类

让我举个例子:

DoSomething(new Runnable() {
   public void run() {
       // "delegate" body
   }
});
它有点冗长,需要一个接口来实现,
但除此之外,它几乎是一样的

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

Java8及以上版本:

将lambda表达式添加到语言中

    doSomething((t) -> t + "asd");
    doSomething((t) -> new StringBuilder(t).reverse().toString());
可以这样传递代码吗 在爪哇?我正在使用处理程序 框架,它有一个相当古老的 Java版本(它没有 仿制药)


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

您的示例在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(); } } });
例如:

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

富吧:123


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

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


Java中没有类似的工具,您可能会对Groovy[2]感兴趣。[1] [2]这并不是说你说的是错的。没错。问题是,这实际上并没有回答被问到的问题——它只是说所有其他答案都是错误的。你是说Java中没有等价物吗?对于大多数用户来说,这里的差别很小。我甚至认为,缺少多播是两者之间更大的区别。就问题的措辞而言,我相信上面的答案是正确的。所有这些都很清楚,他们谈论的是最接近Java的引用。由于引用是原子的,Java版本不会崩溃,但可能会有过时的数据。要使其线程安全,只需添加关键字“volatile”。