Эквивалент C # анонимных методов в Java? - PullRequest
28 голосов
/ 27 августа 2009

В 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 (она не имеет обобщений).

Ответы [ 6 ]

59 голосов
/ 27 августа 2009

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());
12 голосов
/ 27 августа 2009

Не совсем так, но в Java есть нечто похожее.

Это называется анонимными внутренними классами.

Позвольте привести пример:

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

Это немного более многословно и требует интерфейса для реализации, но кроме этого это почти то же самое

3 голосов
/ 27 августа 2009

Ваш пример будет выглядеть в 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(); } } });
2 голосов
/ 11 сентября 2015

Например:

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 голосов
/ 27 августа 2009

Можно ли передать код, подобный этому в Java? Я использую обработку рамки, которая имеет довольно старый версия Java (не имеет дженерики).

Поскольку вопрос, заданный относительно ответа, относящегося к обработке, не имеет прямого эквивалента. Но Processing использует уровень языка Java 1.4, а в Java 1.1 введены анонимные внутренние классы, что является грубым приближением.

0 голосов
/ 10 августа 2017

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

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

В Java нет эквивалента

...