2008-10-16 11 views
18

¿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

39

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).

+1

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

+5

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). –

+0

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. –

9

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.

+0

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

+2

@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). –

2

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).

4

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ú.

1

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).

0

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.

-2

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.

Cuestiones relacionadas