Inicio mis post en lineadecodigo con un pequeño vistazo a los closures.
Antes de empezar debemos de conocer dos conceptos. Por un lado Groovy, es un lenguaje de programación dinámico y fácil de aprender similar a Python y Ruby que va ganando terreno entre los desarrolladores Java.
Y un Closure, es la manera en como una función dentro de otra función contenedora puede hacer referencia a las variables después de que la función contenedora ha terminado de ejecutarse. Este término es algo dificil de entender, sin embargo pienso que con unos cuantos ejemplos entiendan el concepto.
Lo primero que haremos será crear un archivo (o fichero) y lo vamos a llamar «Closures.groovy». Veamos diferentes formas de codificar un clousure:
1. Creamos un closure muy simple.
//imprime el mensaje "Hola desde un closure"
def hola={
println("Hola desde un closure")
}
//invocar closure "hola"
hola()
2. Ahora un closure con un parámetro.
// multiplica un número por 2
def doble={ n ->
return n*2
}
//invocar closure "doble"
def numero=doble(5)
println("el doble de 5 es "+numero)
// también puede escribirse println "el doble de 5 es ${numero}"
3. Ahora un closure con dos parámetros.
def var="Bienvenido"
// imprime el valor de var y el parámetro que le envie el usuario
def msg1={it -> println "${var} ${it}"}
//invocamos el closure, debe salir el mensaje "Bienvenido mundo"
msg1("mundo")
4. Closure más complejo, recibe un método como parámetro.
//defino un closure con dos parámetros
def otro={metodo, parametro -> metodo(parametro)}
//ahora defino dos closure que reciben un solo parámetro
def inicio={it -> println "Hola ${it}"}
def fin={it -> println "Adios ${it}"}
//invoco el closure "otro"
otro(inicio,"Fernando")
otro(fin,"Fernando")
5. Mandamos una lista a un closure.
//defino una lista
def lista=["Andrea","Fernando","Antonio","Lucero","Veronica"]
//uso el closure "inicio"
println "\n"
lista.each inicio
6. Ejemplo con closures y diccionarios.
//defino el diccionario
def dicc=['Fernando':31,'Veronica':27,'María':43,'Yezmin':26,'Horacio':15]
def suma=0
//defino el closure
def edadTotal={ x ->
x.each{
suma+=it.value
// println("obtener valor: "+it.value+ " obtener llave o identificador: "+it.key)
}
println("Suma total de edades: "+suma)
}
//invoco el closure
edadTotal(dicc)
Para ejecutar este archivo pueden teclear desde la consola de comandos:
groovy Closures.groovy
También se puede probar el código mediante la consola groovy:
groovyconsole Closures.groovy
Si quieres puedes leer más información sobre los Closures de Groovy en http://groovy.codehaus.org/Closures