Expresiones lambda

Dado que hoy en día lo que se estila es el uso de las expresiones lambda, voy a intentar resumir en un solo post qué son y cómo se utilizan. Sobre todo voy a procurar simplificarlo lo más posible 🙂

Las expresiones lambda se utilizan para crear funciones anónimas las cuales pueden ser asignadas a delegados o a árboles de expresión.

¿Por qué anónimas?

Porque no necesitamos asignarles un nombre para referirnos a ellas.

¿Qué es un delegado?

Es un objeto que hace referencia a uno o más métodos. Más información aquí.

¿Qué es un árbol de expresión?

Un árbol de expresión representa una estructura en forma de árbol de las expresiones lambda en memoria. Generalmente se potencia su uso en LINQ.

¿Cómo se utilizan?

Para saber cómo utilizar y/o leer una expresión lambda debemos tener en cuenta los siguientes puntos:

  • Parte izquierda: Representa los parámetros  que intervienen en la expresión.
  • Parte central: Se trata del operador lambda, necesario en todas las expresiones de este tipo.
  • Parte derecha: Se definen las acciones a realizar.

 

Puntos importantes:

  1. Las expresiones lambda no utiliza la instrucción return, excepto aquellas que utilicen un bloque encerrado entre llaves.
    suma = (a, b) =>
    {
    return a + b;
    };

  2. No es necesario especificar el tipo de los parámetros, ya que siempre van asociados a un delegado que ya contiene esta información.
    delegate string Delegado(int edad);

    [...]

    Delegado edad = e => string.Format("Tu edad es {0}", e);

  3. Se pueden usar tanto por delegados creados por nosotros como por aquellos definidos por el framework.
    <%= Html.TextBoxFor(m => m.Name) %>

LOS DELEGADOS GENÉRICOS: ACTION Y FUNC

Por otro lado, podemos utilizar los siguientes delegados genéricos en lugar de delegate. Con ellos conseguimos una sintaxis algo más refinada y simple.

Action se utiliza para aquellas expresiones lambda que no retornan ningún valor.

Action<string> saludo = s => Console.Write("Hola {0}!", s);
saludo("Gisela");

Func para aquellas expresiones que retornen un valor.

Func<int, int, int> suma = (a, b) => a + b;
int resultado = suma(3, 5);

Tanto en el caso de Func como en Action el número máximo de parámetros permitido es cuatro (Func figurará como cinco ya que el último es considerado el valor de retorno).

Espero que haya servido como una pequeña introducción al respecto 😉

¡Saludos!

8 comentarios en “Expresiones lambda”

  1. Haciendo pruebas con Expresiones Lambda y Dynamic de C# 4.0, llegue a algo similar a esto:

    Func algo = a, b => b(a);

    Básicamente es aplicar una función a un valor, pudiendo hacer:

    algo(Math.Abs, -20);

    😛

    Dynamic + Functional me parece muy versatil 😀

  2. Hola Gisela

    Haces referncia a una expresion lambda en C# con el operador de ámbito como este ejemplo:

    suma = (a, b) =>
    {
    return a + b;
    };
    Con dicho operador puedes componer una expresion de varias líneas de código. Sin embargo yo trabajo en VB.NET y no he visto manera de poder expresar una expresion lambda en varias líneas de código (quizás por desconocimiento mío) ¿Sabes si se puede hacer y cómo?

    Gracias

  3. Gracias a todos por vuestros comentarios.

    @Julio en cuanto a tu pregunta, una de las novedades que traerá Visual Basic 2010 será el soporte multi-línea en las expresiones lambda y subrutinas, lo cual hasta ahora no soportaba 🙁

    Te dejo un link para que puedas echarle un vistazo de cómo será posible.

    ¡Saludos!

  4. Excelente introduccion, solo no entendi porque dices que los arboles de expresion son usados

    “más concretamente con LINQ To XML.”

    Creo que los beneficios de los arboles de expresion son utiles para cualquier implementacion de LINQ, ya que son las expresiones lambdas, convertidas basicamente a datos, para que puedan ser traducidas al destino que se les este dando a estas, LINQ to DB, XML, etc.

    Un tip adicional por algo que he notado que batallan algunos developers, con el delegato generico Action, si quisieras usarlo para un metodo que no toma parametros ni regresa valor (void), tendrias que usar el tipo Action (el no generico), si se analiza un poquito tiene sentido, porque Action nunca regresa valor (void), asi que si no tenemos ningun parametro, pues no hay ningun que usar

    salu2

  5. Gracias Joaquín y Eber por vuestros comentarios 🙂

    @Eber, tienes razón, la verdad es que no recuerdo por qué concreté con XML ya que se usa en todas ellas ¡Actualizado! Gracias por tu última aportación 😉

    ¡Saludos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *