【问题标题】:Equivalent of C# anonymous methods in Java?等效于 Java 中的 C# 匿名方法?
【发布时间】:2009-08-27 10:38:07
【问题描述】:

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

【问题讨论】:

标签: java c# delegates processing anonymous-function


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

称为匿名内部类。

让我举个例子:

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

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

【讨论】:

    【解决方案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(); } } });
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        例如:

        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

        【讨论】:

          【解决方案6】:

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

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

          Java 中没有等价物

          【讨论】:

          • 不是你说的不对。这是正确的。问题是,这实际上并没有回答所提出的问题——它只是说所有其他答案都是错误的。您是说在 Java 中没有等价物吗?
          • 对于大多数用户来说,这里的差异很小。我什至认为缺少多播是两者之间更大的区别。就问题的措辞而言,我相信上面的答案是正确的。所有人都清楚,他们谈论的是最接近 Java 的。
          • 由于引用是原子的,Java 版本不会崩溃,但您可能有过时的数据。为了使其线程安全,您只需添加关键字“volatile”。
          猜你喜欢
          • 1970-01-01
          • 2022-01-04
          • 1970-01-01
          • 1970-01-01
          • 2011-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多