web-dev-qa-db-ja.com

JavaのC#匿名メソッドに相当しますか?

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(ジェネリックはありません)のかなり古いバージョンがある処理フレームワークを使用しています。

29
Callum Rogers

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 ラムダ式を言語に追加します。

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

これとまったく同じではありませんが、Javaには似たようなものがあります。

これは匿名内部クラスと呼ばれます。

例を挙げましょう:

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

これはもう少し冗長で、実装するにはインターフェイスが必要ですが、それ以外はほとんど同じです。

12

あなたの例は、匿名の内部クラスを使用して、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
Jesper

例えば ​​:

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 Bar:123

2
JAN

このようなコードをJavaで渡すことは可能ですか? Java(ジェネリックはありません)のかなり古いバージョンがある処理フレームワークを使用しています。

質問は処理固有の回答について尋ねられたため、直接同等のものはありません。ただし、ProcessingはJava 1.4言語レベルを使用し、Java 1.1は、大まかな概算である匿名内部クラスを導入しました。

2
John Feminella

ここで、C#デリゲートがまずスレッドセーフであることを忘れてしまいました。これらの例は、シングルスレッドアプリ専用です。

現代のアプリのほとんどはマルチスレッドの概念で書かれています。したがって、誰も答えはありません。

Javaには同等のものはありません

0
user8404505