c# - una - no se puede convertir expresion lambda en el tipo delegado
¿Qué razón hay para que C#o Java tengan lambdas? (8)
Los de Lambda permiten un código más legible ya que permiten que las operaciones se definan más cerca del punto de uso que como el método actual de C ++ para usar objetos funcionales cuya definición a veces está lejos del punto de uso. (Esto no incluye algunas de las bibliotecas de impulso). Creo que el punto clave de lambdas es que permiten un código más conciso y fácil de entender.
¿Qué razón hay para que C # o java tengan lambdas? Ninguno de los dos lenguajes se basa en ellos, parece ser otro método de codificación para hacer lo mismo que C #.
No estoy siendo agresivo, si hay una razón por la que me gustaría saber el motivo. A los efectos de la revelación completa, soy un programador de Java con un fondo de C ++ sin experiencia de lisp, me puede estar perdiendo el sentido.
Azúcar sintáctica.
Proporciona una forma conveniente y más legible de representar una idea, en este caso, un pequeño método desechable. Debajo del capó, el compilador lo expande a una llamada de delegado y método, pero es la cosa que hace el trabajo, no tú.
C # no busca la pureza de una escuela particular de diseño de lenguaje (a diferencia de Java, que fue diseñado por los Smalltalkers como algo así como un lenguaje OO puro). C # va por todo para todo el mundo, y es bastante bueno en eso. C # se basa en reunir lo mejor de los diversos estilos de programación en un lenguaje de alta calidad y bien respaldado. Eso incluye estilos de programación procedural, orientada a objetos, funcional, dinámica, lógica, etc. Obviamente, hasta ahora no tiene mucho en el camino de los estilos dinámicos o lógicos de programación, pero eso pronto vendrá (la programación dinámica viene con C # 4.0).
En el caso de C #, las lambdas se usan internamente para implementar LINQ. Vea el artículo La evolución de LINQ y su impacto en el diseño de C #
Hay casos de uso comunes que requieren pasar (o almacenar) un bloque de código para ser ejecutado más tarde. Los más comunes serían los oyentes del evento. Lo creas o no, el siguiente bit de código usa una construcción lambda-ish en Java:
JButton button = new JButton("Push me!");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Pressed!");
}
});
La clase interna anónima actúa como un lambda, aunque extremadamente detallado. Con un poco de magia de conversión implícita, podemos escribir el siguiente equivalente en Scala:
val button = new JButton("Push me!")
button.addActionListener { e =>
println("Pressed!")
}
C # hace que este tipo de cosas sea bastante fácil con delegados y (incluso mejor) lambdas.
Lambdas te permite escribir un código menos expresivo y más expresivo. Por ejemplo, enumera las comprensiones ...
Por cierto, se está trabajando para explorar la posibilidad de agregar cierres a Java; mientras tanto, es necesario usar clases anónimas (feas).
Veo lambdas en C # como un atajo muy conveniente para hacer delegados. Mucho más legible para tener el código allí donde se usa en lugar de tener que buscar en otro lugar la definición del delegado.
Ofrecen una mayor seguridad al utilizar el multi-threading en Java al implicar en muchos casos la opción "final". Por lo tanto, no es propenso a errores por tareas múltiples.