10.29.2009

Expresiones Lambda en VB.NET 9.0

Explorando un poco las nuevas facilidades del lenguaje VB.NET en el framework 4.0, me encontré con algo que realmente me llamó la atención positivamente: expresiones lambda. Una de las formas de aprovechar las expresiones lambda es utilizandolas en las extensiones de métodos que tienen diversas clases, las cuales nos permiten de forma sencilla realizar operaciones que normalmente tomarían muchas líneas de código. Veamos el siguiente ejemplo:

En versiones anteriores se podía en VB.NET – y también en C# – utilizar la extensión del método FindAll de una lista para obtener una sub lista con todos los ítems que hicieran match con el criterio del predicado enviado por parámetro al método de extensión. El predicado de esta función, por lo general es un delegate que apunta a un método definido en otro lugar, o es un método anónimo. El siguiente código nos muestra esta situación:

image

Como podemos ver en la figura, tenemos una lista de enteros la cual se inicializa de 1 a 10. Seguidamente vamos a crear otra lista de enteros y la vamos a inicializar solamente con los números pares de la lista inicial. Esto lo logramos utilizando un predicado en el método de extensión FindAll de la clase List(Of T ), este predicado contiene la dirección de un método el cual se va a ejecutar por cada ítem contenido en la lista.

Si usamos una expresión lambda, el método será un poco más sencillo de escribir, tal y como podemos ver en el siguiente código:

image

El método anterior funciona de forma idéntica al método en donde utilizamos un delegate, pero no tiene una referencia a otro método que haga la operación deseada, en cambio la expresión lambda escrita como predicado del método FindAll se ejecuta de la misma manera que se ejecuta el delegate a la función ObtenerPares.

3 comentarios:

Anónimo dijo...

que delicia encontrar una explicación tan simple y bien ilustrada!

Diego Rojas dijo...

Gracias por tu comentario

Gochoa dijo...

Mil gracias por tu explicación tan sencilla. Entendí perfectamente.