¿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 conflictivo, 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.¿Qué razón hay para que C# o Java tengan lambdas?
Respuesta
Hay casos de uso comunes que requieren pasar (o almacenar) un bloque de código que se ejecutará más adelante. Los más comunes serían los oyentes del evento. Lo creas o no, el siguiente fragmento de código utiliza un constructo 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 está actuando como lambda, aunque uno muy detallado. Con un poco de magia conversión implícita, podemos escribir la siguiente equivalente en Scala:
val button = new JButton("Push me!")
button.addActionListener { e =>
println("Pressed!")
}
C# hace que este tipo de cosas bastante fácil con los delegados y lambda (aún mejor).
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.
Las funciones anónimas y las lambdas son diferentes en C# - http://blogs.msdn.com/ericlippert/archive/2007/01/10/lambda-expressions-vs-anonymous-methods-part-one.aspx – johnstok
@johnstok - Un poco tarde para señalar esto, pero ese artículo dice que solo son diferentes desde la perspectiva del implementador de un compilador de C# (que es el autor de ese blog). –
Las lambdas le permiten escribir un código menos expresivo y más expresivo. Por ejemplo, list comprehensions ...
BTW, se está trabajando para explorar la posibilidad de agregar cierres a Java; mientras tanto, es necesario utilizar clases anónimas (feo).
Syntactic Sugar.
Proporciona una forma conveniente y 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 va por la pureza de una escuela de diseño de lenguaje en particular (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. Ver el artículo The Evolution Of LINQ And Its Impact On The Design Of C#
Lambda permite un código más legible ya que permiten definir las operaciones más cerca del punto de uso en lugar de utilizar el método actual 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.
Ofrecen una mejor seguridad utilizando 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.
- 1. Estilo C#: Lambdas, _ => o x =>?
- 2. ¿Hay alguna razón para usar Object.create() o new en JavaScript?
- 3. ¿Hay alguna razón para usar propiedades privadas en C#?
- 4. ¿C++ soportará 0x __stdcall o extern captura "C" -nada lambdas?
- 5. Qué herramientas NLP usar para unir frases que tengan un significado o semántica similar
- 6. ¿Hay alguna razón para usar esto->
- 7. ¿Hay marcos JavaScript MVC que no tengan dependencias externas?
- 8. ¿Hay alguna razón para preferir UTF-16 a UTF-8?
- 9. Lambdas en C++/CLI
- 10. ¿Hay una biblioteca que pueda compilar C++ o C
- 11. ¿Hay alguna razón para lanzar una DivideByZeroException?
- 12. ¿Hay alguna razón para usar System.Uri?
- 13. ¿Debo usar C++ 11 lambdas ahora?
- 14. Qué hay que hacer para implementar "importar ... como ..." en java
- 15. ¿Por qué C# no permite que los tipos que usan composición tengan conversiones implícitas para las interfaces?
- 16. ¿Por qué no hay operadores || = o && = en C#?
- 17. ¿Hay alguna razón legítima para ocultar los métodos estáticos?
- 18. ¿Por qué no hay byte o literales cortos en Java?
- 19. Hay una razón por la que cshtml no es popular
- 20. ¿Alguna vez hay una buena razón para usar Insertion Sort?
- 21. ¿Hay alguna razón para que esta simple consulta SQL sea tan lenta?
- 22. ¿Hay alguna razón técnica para usar o no usar var en C# cuando se conoce el tipo?
- 23. En Java, ¿por qué los arrays son objetos? ¿Hay alguna razón específica?
- 24. Java o C para procesamiento de imágenes
- 25. ¿Hay alguna razón por la que no debería comenzar con C#
- 26. ¿Hay alguna razón por la cual un programador de Windows .Net necesita aprender C o C++ nunca más?
- 27. ¿Alguna vez hay una buena razón para usar eval()?
- 28. ¿Hay herramientas para integrar Java y C++?
- 29. ¿Hay alguna buena razón para usar Websockets fuera del navegador?
- 30. C++ 0x lambdas con parámetros de plantilla?
Puedo ver la razón por la cual con su ejemplo, también puedo ver cómo podría causar mucha confusión intentar depurar hasta que una lambdas aprenda extremadamente bien. – WolfmanDragon
En realidad, en mi experiencia, el código de lambda es * más fácil * de depurar que el código equivalente escrito sin lambdas. Son realmente muy intuitivos una vez que te mentalizas y se usan con prudencia, pueden reducir el volumen (lo que obviamente ayuda a cualquier tarea relacionada con el código, incluida la depuración). –
La sutil diferencia entre los delegados lambdas (más comparables a los métodos anónimos) y Expression lambdas también es una consideración importante, pero es una buena publicación. –