Эквивалент анонимных методов С# в Java?

В С# вы можете определить делегаты анонимно (хотя это не что иное, как синтаксический сахар). Например, я могу это сделать:

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 (у нее нет дженериков).

Ответы

Ответ 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 добавляет лямбда-выражения к языку.

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

Ответ 6

Вы все здесь забыли, что делегат С# в первую очередь - потокобезопасный. Эти примеры предназначены только для одного потока приложений.

Большинство современных приложений написаны на многопоточной концепции. Таким образом, никто не отвечает.

В Java

нет эквивалента.