Вопрос

В 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?Я использую processing framework, у которого довольно старая версия 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 добавляет лямбда-выражения в язык.

    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?Я использую processing framework, который имеет довольно старую версию Java (в ней нет дженериков).

Поскольку заданный вопрос касается конкретного ответа на Обработку, прямого эквивалента не существует.Но при обработке используется уровень языка 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

Фу-Бар:123

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top