Equivalente de C # los métodos anónimos en Java?
-
20-09-2019 - |
Pregunta
En C # se puede definir de forma anónima delegados (a pesar de que no son nada más que el azúcar sintáctica). Por ejemplo, yo puedo hacer esto:
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(); });
¿Es posible pasar código como este en Java? Estoy usando el marco de procesamiento, que tiene una versión muy antigua de Java (que no tiene los genéricos).
Solución
Pre Java 8:
El más cercano de Java tiene que delegados son interfaces de métodos individuales. Se podría utilizar una clase interna anónima.
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 y superior:
Java 8 añade expresiones lambda a la lengua.
doSomething((t) -> t + "asd");
doSomething((t) -> new StringBuilder(t).reverse().toString());
Otros consejos
No es exactamente así, pero Java tiene algo similar.
Se llama clases internas anónimas.
Te voy a dar un ejemplo:
DoSomething(new Runnable() {
public void run() {
// "delegate" body
}
});
Es un poco más detallado y requiere una interfaz de implementar, pero aparte de eso es más o menos lo mismo
Su ejemplo se vería así en Java, usando clases internas anónimas:
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(); } } });
¿Es posible pasar un código como éste en Java? Estoy usando el procesamiento marco, que tiene una bastante antiguo versión de Java (que no tiene genéricos).
Dado que la pregunta le preguntó sobre la respuesta de Proceso específica, no existe un equivalente directo. Pero Processing utiliza el nivel de lenguaje Java 1.4 y Java 1.1 introdujo clases internas anónimas, que son una aproximación.
Por ejemplo:
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);
}
}
Salida:
Bla Bla: 123
Foo Bar: 123
Todos han olvidado aquí que un C # en primer lugar delegado - es hilo de seguridad . Estos ejemplos son sólo para un solo hilo App ..
La mayoría de las aplicaciones actuales están escritos en el concepto de multiproceso .. Así que hay una sola respuesta es la respuesta.
No hay un equivalente en Java