簡體   English   中英

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

[英]Equivalent of C# anonymous methods in 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(它沒有泛型)。

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

不完全是這樣,但Java有類似的東西。

它被稱為匿名內部類。

讓我給你舉個例子:

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

它有點冗長,需要一個接口來實現,但除此之外它幾乎是一樣的

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

是否可以在Java中傳遞這樣的代碼? 我正在使用處理框架,它有一個相當舊版本的Java(它沒有泛型)。

由於問題是關於特定於處理的答案,因此沒有直接的等價物。 但是Processing使用Java 1.4語言級別,Java 1.1引入了匿名內部類,這是一個粗略的近似。

例如 :

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

輸出:

Bla Bla:123

Foo Bar:123

你們都忘記了首先是C#委托 - 是線程安全的 這些示例僅適用於單線程App ..

大多數現代應用程序都是用多線程概念編寫的。所以沒有一個答案是答案。

Java中沒有相應的東西

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM