Introducción a las Closures
Las closures en Groovy son una característica poderosa y flexible que permite definir bloques de código que pueden ser asignados a variables, pasados como argumentos a métodos y ejecutados en diferentes contextos. Las closures son similares a las lambdas en otros lenguajes de programación, pero con capacidades adicionales.
Conceptos Clave
- Definición de Closure: Una closure es un bloque de código que puede ser ejecutado en un contexto diferido.
- Sintaxis de Closure: Las closures se definen utilizando llaves
{}
y pueden aceptar parámetros. - Contexto de Ejecución: Las closures pueden acceder a variables del contexto en el que fueron definidas.
Sintaxis Básica
La sintaxis básica de una closure en Groovy es la siguiente:
def closureName = { param1, param2 -> // Cuerpo de la closure println "Parámetro 1: $param1, Parámetro 2: $param2" }
Ejemplo Práctico
En este ejemplo, greet
es una closure que toma un parámetro name
y lo utiliza para imprimir un saludo.
Closures con Diferentes Cantidades de Parámetros
Las closures pueden tener cualquier número de parámetros, incluyendo ninguno.
Sin Parámetros
Un Parámetro
Múltiples Parámetros
Closures como Argumentos de Métodos
Las closures pueden ser pasadas como argumentos a métodos, lo que permite un alto grado de flexibilidad y reutilización de código.
Ejemplo de Closure como Argumento
def operateOnNumbers = { a, b, operation -> operation(a, b) } def multiply = { x, y -> x * y } println operateOnNumbers(4, 5, multiply) // Salida: 20
En este ejemplo, operateOnNumbers
es un método que toma dos números y una operación (closure) y aplica la operación a los números.
Closures y el Contexto de Ejecución
Las closures en Groovy pueden acceder a variables definidas en su contexto de creación.
Ejemplo de Contexto de Ejecución
def factor = 2 def multiplyByFactor = { num -> num * factor } println multiplyByFactor(5) // Salida: 10
En este ejemplo, la closure multiplyByFactor
accede a la variable factor
definida en su contexto de creación.
Ejercicios Prácticos
Ejercicio 1: Crear una Closure para Filtrar una Lista
Crea una closure que filtre una lista de números y devuelva solo los números pares.
def filterEvenNumbers = { list -> list.findAll { it % 2 == 0 } } def numbers = [1, 2, 3, 4, 5, 6] println filterEvenNumbers(numbers) // Salida: [2, 4, 6]
Ejercicio 2: Crear una Closure para Transformar una Lista
Crea una closure que tome una lista de cadenas y las convierta a mayúsculas.
def toUpperCase = { list -> list.collect { it.toUpperCase() } } def words = ["groovy", "is", "cool"] println toUpperCase(words) // Salida: [GROOVY, IS, COOL]
Ejercicio 3: Crear una Closure para Calcular el Factorial
Crea una closure que calcule el factorial de un número.
def factorial = { n -> (1..n).inject(1) { acc, val -> acc * val } } println factorial(5) // Salida: 120
Resumen
En esta sección, hemos aprendido sobre las closures en Groovy, su sintaxis básica, cómo pueden aceptar diferentes cantidades de parámetros, y cómo pueden ser utilizadas como argumentos de métodos. También hemos visto cómo las closures pueden acceder a su contexto de ejecución y hemos practicado con algunos ejercicios prácticos. Las closures son una herramienta poderosa en Groovy que permite escribir código más flexible y reutilizable.
Curso de Programación Groovy
Módulo 1: Introducción a Groovy
Módulo 2: Sintaxis de Groovy y Características del Lenguaje
Módulo 3: Programación Orientada a Objetos en Groovy
Módulo 4: Características Avanzadas de Groovy
Módulo 5: Groovy en la Práctica
- Entrada/Salida de Archivos
- Trabajando con XML y JSON
- Acceso a Bases de Datos
- Desarrollo Web con Groovy
Módulo 6: Pruebas y Depuración
Módulo 7: Ecosistema y Herramientas de Groovy
- Herramienta de Construcción Gradle
- Framework de Pruebas Spock
- Framework Grails
- Otras Bibliotecas y Herramientas de Groovy
Módulo 8: Mejores Prácticas y Temas Avanzados
- Estilo de Código y Convenciones
- Optimización del Rendimiento
- Consideraciones de Seguridad
- Concurrencia en Groovy