Эквивалент анонимных методов С# в 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
нет эквивалента.