0
Introducción a Groovy
Acerca del presentador <ul><li>Desarrollador Java desde 1996 </li></ul><ul><li>Fan de Groovy desde 2006 dado que a veces J...
Agenda <ul><li>Qué es Groovy? </li></ul><ul><li>De Java a Groovy </li></ul><ul><li>Características I (cerca de casa)‏ </li...
Que es Groovy? <ul><li>Groovy es un lenguage  ágil  y  dinámico  para la Máquina Virtual de Java  </li></ul><ul><li>Basado...
Que es Groovy? <ul><li>Simplifica el ciclo de pruebas dado que soporta pruebas unitarias y  mocking  desde el inicio. </li...
De Java a Groovy
HolaMundo en Java <ul><li>public class  HelloWorld { </li></ul><ul><li>String name; </li></ul><ul><li>public   void  setNa...
HolaMundo en Groovy <ul><li>public class  HelloWorld { </li></ul><ul><li>String name; </li></ul><ul><li>public   void  set...
Paso 1: Adios a lo obvio <ul><li>Toda clase, método, campo en Groovy tiene acceso público a menos de que se especifique lo...
Paso 1: Resultado <ul><li>class  HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>void  setName(String name)‏ ...
Paso 2: Adios a lo ceremonioso <ul><li>Neal Ford proclama que el debate  estático vs dinámico  es en realidad  ceremonia v...
Paso 2: Resultado <ul><li>class  HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>String greet()‏ </li></ul><u...
Paso 3: Tipos dinámicos <ul><li>La palabra reservada  def  se usa cuando no es necesario indicar el tipo específico de una...
Paso 3: Resultado <ul><li>class  HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>def  greet()‏ </li></ul><ul>...
Paso 4:  Usar interpolación de variables <ul><li>Groovy permite la interpolación de variables a través de GStrings (simila...
Paso 4: Resultado <ul><li>class  HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>def  greet(){ return  &quot;...
Paso 5:  Adios a otras palabras reservadas <ul><li>La palabra return es opcional en muchos de los casos, el valor de retor...
Paso 5: Resultado <ul><li>class  HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>def  greet(){  &quot;Hello $...
Paso 6: POJOs con esteroides <ul><li>Los POJOs (o POGOs en Groovy) tienen un constructor por omisión que acepta un Map, da...
Paso 6: Resultado <ul><li>class  HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>def  greet(){  &quot;Hello $...
Paso 7: Groovy soporta scripts <ul><li>A pesar de que Groovy compila a código byte, soporta programas tipo script, los cua...
Paso 7: Resultado <ul><li>class  HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>def  greet() {  &quot;Hello ...
Venimos desde aquí... <ul><li>public class  HelloWorld { </li></ul><ul><li>String name; </li></ul><ul><li>public   void  s...
... hasta acá <ul><li>class  HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>def  greet() {  &quot;Hello $nam...
<ul><ul><li>Características I  </li></ul></ul><ul><ul><li>(cerca de casa)‏ </li></ul></ul>
El lema es ... <ul><li>Java es Groovy, Groovy es Java </li></ul><ul><li>Groovy ofrece una curva de aprendizaje sencilla pa...
Problemas comunes <ul><li>La sintaxis de Groovy no es un super-conjunto exacto de la sintaxis de Java dado que no soporta ...
Características I - JDK5 <ul><li>Groovy soporta anotaciones (JSR 175) iguales a las de Java, es mas, es el segundo lenguag...
Características I - JDK5 <ul><li>Es posible hacer uso de número de argumentos variables (varargs) mediante dos formas </li...
Varargs en acción <ul><li>class  Calculator { </li></ul><ul><li>def  addAllGroovy( Object[] args ){ </li></ul><ul><li>int ...
<ul><ul><li>Características II  </li></ul></ul><ul><ul><li>(explorando el vecindario)‏ </li></ul></ul>
Miscelaneos <ul><li>Parámetros con valor por omisión (PHP)‏ </li></ul><ul><li>Parámetros con nombre (Ruby), en realidad no...
Closures <ul><li>Closures pueden ser interpretadas como bloques de código reusable, probablemente las hayas visto en otros...
Ejemplos de Closures <ul><li>def  greet = { name -> println  “Hello $name”  } </li></ul><ul><li>greet(  “Groovy”  )‏ </li>...
Currying <ul><li>Currying  es una técnica de programación que transforma una función (o closure) de número de parámetros  ...
Currying en acción <ul><li>// un closure con 3 parámetros, el tercero es opcional dado </li></ul><ul><li>// que define un ...
Iteradores por doquier <ul><li>Asi como en Ruby, puedes hacer uso de iteradores prácticamente en cualquier contexto </li><...
Iteradores en acción <ul><li>def  printIt = { println it } </li></ul><ul><li>// 3 ways to iterate from 1 to 5 </li></ul><u...
<ul><ul><li>Características III  </li></ul></ul><ul><ul><li>(al infinito y mas allá!)‏ </li></ul></ul>
La palabra reservada as <ul><li>Permite  “Groovy casting” , es decir, convertir un valor de tipoA a tipoB </li></ul><ul><u...
Algunos ejemplos de as <ul><li>import  javax.swing.table.DefaultTableCellRenderer  as  DTCR </li></ul><ul><li>def  myActio...
Nuevos operadores <ul><li>?: (elvis) -  un refinamiento del operador ternario </li></ul><ul><li>?. referencia segura – per...
Navegando grafos de objetos <ul><li>GPath es a objetos lo que XPath es a XML </li></ul><ul><li>*. y ?. son  bastante  útil...
Ejemplos de GPath <ul><li>class  Person { </li></ul><ul><li>String name </li></ul><ul><li>int id </li></ul><ul><li>} </li>...
Metaprogramación <ul><li>Puedes agregar métodos y propiedades a un objeto en tiempo de ejecución </li></ul><ul><li>Puedes ...
Ejemplo con categorías <ul><li>class  Pouncer { </li></ul><ul><li>static  pounce( Integer self ){ </li></ul><ul><li>def  s...
Ejemplo con Metaclases <ul><li>Integer. metaClass.pounce << { -> </li></ul><ul><li>def  s =  “Boing!&quot; </li></ul><ul><...
Groovy y Spring
Varias Alternativas <ul><li>Compilar el código Groovy a código byte </li></ul><ul><li>Usar el módulo  lang  para referenci...
1. Compilar Groovy <ul><li>El compilador de Groovy puede ser invocado de distintas maneras </li></ul><ul><ul><li>comando g...
2. El módulo lang <ul><li>Requiere el uso del schema spring-lang </li></ul><ul><li>Se recomienda usar  ApplicationContext ...
Referencia a clase Groovy <ul><li><?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?> </li></ul><ul><li><beans xmln...
3. Scripts en línea <ul><li>Requiere las mismas características que la opción anterior </li></ul><ul><li>Útil para crear i...
Ejemplo <ul><li><?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?> </li></ul><ul><li><beans xmlns=&quot;http://www...
Preguntas y Respuestas
Información adicional <ul><li>Groovy, guías, ejemplos </li></ul><ul><ul><li>http://groovy.codehaus.org </li></ul></ul><ul>...
Gracias!
Upcoming SlideShare
Loading in...5
×

Introduccion A Groovy

7,879

Published on

Presentación introductoria a Groovy en la primera reunión de la comunidad Springhispano.org

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,879
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
184
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Transcript of "Introduccion A Groovy"

  1. 1. Introducción a Groovy
  2. 2. Acerca del presentador <ul><li>Desarrollador Java desde 1996 </li></ul><ul><li>Fan de Groovy desde 2006 dado que a veces Java estorbaba </li></ul><ul><li>Miembro del equipo Groovy desde Agosto 2007 </li></ul><ul><li>Fundador de proyectos como JideBuilder, GraphicsBuilder, WingSBuilder, Grapplet y Json-lib </li></ul>
  3. 3. Agenda <ul><li>Qué es Groovy? </li></ul><ul><li>De Java a Groovy </li></ul><ul><li>Características I (cerca de casa)‏ </li></ul><ul><li>Características II (explorando el vecindario)‏ </li></ul><ul><li>Características III (al infinito y mas allá!)‏ </li></ul><ul><li>Groovy & Spring </li></ul>
  4. 4. Que es Groovy? <ul><li>Groovy es un lenguage ágil y dinámico para la Máquina Virtual de Java </li></ul><ul><li>Basado en los conceptos base del lenguage Java, incluye características inspiradas en otros lenguages como Python, Ruby y Smalltalk. </li></ul><ul><li>Habilita características de programación modernas con una curva de aprendizaje prácticamente plana para desarrolladores Java </li></ul><ul><li>Soporta Lenguages de Dominio Específico y otras carcaterísticas de syntaxis corta </li></ul>
  5. 5. Que es Groovy? <ul><li>Simplifica el ciclo de pruebas dado que soporta pruebas unitarias y mocking desde el inicio. </li></ul><ul><li>Se integra sin problemas con cualquier objecto y/o librería Java existentes </li></ul><ul><li>Compila directamente a código byte (igual que Java) puede ser usado virtualmente en cualquier lugar donde Java puede serlo también </li></ul>
  6. 6. De Java a Groovy
  7. 7. HolaMundo en Java <ul><li>public class HelloWorld { </li></ul><ul><li>String name; </li></ul><ul><li>public void setName(String name)‏ </li></ul><ul><li>{ this.name = name; } </li></ul><ul><li>public String getName(){ return name; } </li></ul><ul><li>public String greet()‏ </li></ul><ul><li>{ return “Hello “ + name; } </li></ul><ul><li>public static void main(String args[]){ </li></ul><ul><li>HelloWorld helloWorld = new HelloWorld()‏ </li></ul><ul><li>helloWorld.setName( “Groovy” )‏ </li></ul><ul><li>System.err.println( helloWorld.greet() )‏ </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  8. 8. HolaMundo en Groovy <ul><li>public class HelloWorld { </li></ul><ul><li>String name; </li></ul><ul><li>public void setName(String name)‏ </li></ul><ul><li>{ this.name = name; } </li></ul><ul><li>public String getName(){ return name; } </li></ul><ul><li>public String greet()‏ </li></ul><ul><li>{ return “Hello “ + name; } </li></ul><ul><li>public static void main(String args[]){ </li></ul><ul><li>HelloWorld helloWorld = new HelloWorld()‏ </li></ul><ul><li>helloWorld.setName( “Groovy” )‏ </li></ul><ul><li>System.err.println( helloWorld.greet() )‏ </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  9. 9. Paso 1: Adios a lo obvio <ul><li>Toda clase, método, campo en Groovy tiene acceso público a menos de que se especifique lo contrario </li></ul><ul><li>';' es opcional al final de línea en la mayoría de los casos </li></ul>
  10. 10. Paso 1: Resultado <ul><li>class HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>void setName(String name)‏ </li></ul><ul><li>{ this.name = name } </li></ul><ul><li>String getName(){ return name } </li></ul><ul><li>String greet()‏ </li></ul><ul><li>{ return &quot;Hello &quot; + name } </li></ul><ul><li>static void main(String args[]){ </li></ul><ul><li>HelloWorld helloWorld = new HelloWorld()‏ </li></ul><ul><li>helloWorld.setName( &quot;Groovy&quot; )‏ </li></ul><ul><li>System.err.println( helloWorld.greet() )‏ </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  11. 11. Paso 2: Adios a lo ceremonioso <ul><li>Neal Ford proclama que el debate estático vs dinámico es en realidad ceremonia vs esencia </li></ul><ul><li>Según la convención JavaBeans, cada propiedad requiere de un par de métodos (get/set)‏ </li></ul><ul><li>El método main() siempre require de String[] como parámetro </li></ul><ul><li>Imprimir a consola es muy común, acaso existe alguna manera mas corta? </li></ul>
  12. 12. Paso 2: Resultado <ul><li>class HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>String greet()‏ </li></ul><ul><li>{ return &quot;Hello &quot; + name } </li></ul><ul><li>static void main( args ){ </li></ul><ul><li>HelloWorld helloWorld = new HelloWorld()‏ </li></ul><ul><li>helloWorld.setName( &quot;Groovy&quot; )‏ </li></ul><ul><li>println( helloWorld.greet() )‏ </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  13. 13. Paso 3: Tipos dinámicos <ul><li>La palabra reservada def se usa cuando no es necesario indicar el tipo específico de una variable, método o campo (es como var en JavaScript)‏ </li></ul><ul><li>Groovy averiguará el tipo correcto en tiempo de ejecución, esto habilita entre otras cosas lo que se conoce como duck typing </li></ul>
  14. 14. Paso 3: Resultado <ul><li>class HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>def greet()‏ </li></ul><ul><li>{ return &quot;Hello &quot; + name } </li></ul><ul><li>static def main( args ){ </li></ul><ul><li>def helloWorld = new HelloWorld()‏ </li></ul><ul><li>helloWorld.setName( &quot;Groovy&quot; )‏ </li></ul><ul><li>println( helloWorld.greet() )‏ </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  15. 15. Paso 4: Usar interpolación de variables <ul><li>Groovy permite la interpolación de variables a través de GStrings (similar a como lo hace Perl)‏ </li></ul><ul><li>Basta con rodear una expresión con ${} en cualquier String </li></ul>
  16. 16. Paso 4: Resultado <ul><li>class HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>def greet(){ return &quot;Hello ${name}&quot; } </li></ul><ul><li>static def main( args ){ </li></ul><ul><li>def helloWorld = new HelloWorld()‏ </li></ul><ul><li>helloWorld.setName( &quot;Groovy&quot; )‏ </li></ul><ul><li>println( helloWorld.greet() )‏ </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  17. 17. Paso 5: Adios a otras palabras reservadas <ul><li>La palabra return es opcional en muchos de los casos, el valor de retorno será el valor de la última expresión evaluada en el contexto </li></ul><ul><li>La palabra def no es necesaria cuando se trata de métodos estáticos </li></ul>
  18. 18. Paso 5: Resultado <ul><li>class HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>def greet(){ &quot;Hello ${name}&quot; } </li></ul><ul><li>static main( args ){ </li></ul><ul><li>def he new HelloWorld()‏ </li></ul><ul><li>helloWorld.setName( &quot;Groovy&quot; )‏ </li></ul><ul><li>println( helloWorld.greet() )‏ </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>// OJO versiones anteriores del plugin de Groovy para Eclipse </li></ul><ul><li>// requieren que exista el método main definido de la siguiente </li></ul><ul><li>// manera </li></ul><ul><li>// </li></ul><ul><li>// static void main( String[] args )‏ </li></ul>
  19. 19. Paso 6: POJOs con esteroides <ul><li>Los POJOs (o POGOs en Groovy) tienen un constructor por omisión que acepta un Map, dando la impresión de usar parámetros con nombres </li></ul><ul><li>Los POGOs suportan la notación de arreglo (bean[prop]) o la notación de objeto (bean.prop) para acceder a sus propiedades (lectura/escritura)‏ </li></ul>
  20. 20. Paso 6: Resultado <ul><li>class HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>def greet(){ &quot;Hello ${name}&quot; } </li></ul><ul><li>static main( args ){ </li></ul><ul><li>def helloWorld = new </li></ul><ul><li>HelloWorld(name: &quot;Groovy&quot; )‏ </li></ul><ul><li>helloWorld.name = &quot;Groovy&quot; </li></ul><ul><li>helloWorld[ &quot; name &quot; ] = &quot;Groovy&quot; </li></ul><ul><li>println( helloWorld.greet() )‏ </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  21. 21. Paso 7: Groovy soporta scripts <ul><li>A pesar de que Groovy compila a código byte, soporta programas tipo script, los cuales también se compilan a código byte </li></ul><ul><li>Todo Script permite definir clases en cualquier parte </li></ul><ul><li>Todo script soporta definición de paquetes (package) puesto que al fin y al cabo también son clases Java </li></ul>
  22. 22. Paso 7: Resultado <ul><li>class HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>def greet() { &quot;Hello $name&quot; } </li></ul><ul><li>} </li></ul><ul><li>def helloWorld = new HelloWorld(name : &quot; Groovy&quot; )‏ </li></ul><ul><li>println helloWorld.greet()‏ </li></ul>
  23. 23. Venimos desde aquí... <ul><li>public class HelloWorld { </li></ul><ul><li>String name; </li></ul><ul><li>public void setName(String name)‏ </li></ul><ul><li>{ this.name = name; } </li></ul><ul><li>public String getName(){ return name; } </li></ul><ul><li>public String greet()‏ </li></ul><ul><li>{ return &quot;Hello &quot; + name; } </li></ul><ul><li>public static void main(String args[]){ </li></ul><ul><li>HelloWorld helloWorld = new HelloWorld()‏ </li></ul><ul><li>helloWorld.setName( &quot;Groovy&quot; )‏ </li></ul><ul><li>System.err.println( helloWorld.greet() )‏ </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  24. 24. ... hasta acá <ul><li>class HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>def greet() { &quot;Hello $name&quot; } </li></ul><ul><li>} </li></ul><ul><li>def helloWorld = new HelloWorld(name : &quot; Groovy&quot; )‏ </li></ul><ul><li>println helloWorld.greet()‏ </li></ul>
  25. 25. <ul><ul><li>Características I </li></ul></ul><ul><ul><li>(cerca de casa)‏ </li></ul></ul>
  26. 26. El lema es ... <ul><li>Java es Groovy, Groovy es Java </li></ul><ul><li>Groovy ofrece una curva de aprendizaje sencilla para desarrolladores Java. Puedes empezar con sintaxis Java y moverte poco a poc a la sintaxis Groovy </li></ul><ul><li>98% de código Java es código Groovy, virtualmente podrías renombar un archivo *.java a .groovy y compilaría </li></ul>
  27. 27. Problemas comunes <ul><li>La sintaxis de Groovy no es un super-conjunto exacto de la sintaxis de Java dado que no soporta </li></ul><ul><li>Inicializadores literales de arreglos </li></ul><ul><ul><li>int[] arreglo = { 1,2,3 } </li></ul></ul><ul><li>definición de clases internas </li></ul><ul><li>instanciar clases internas no estáticas </li></ul><ul><ul><li>A.B ab = instanciaA.new B()‏ </li></ul></ul>
  28. 28. Características I - JDK5 <ul><li>Groovy soporta anotaciones (JSR 175) iguales a las de Java, es mas, es el segundo lenguage en la JVM que las soporta. </li></ul><ul><ul><li>hasta el momento no es definir anotaciones con Groovy </li></ul></ul><ul><li>Groovy soporta Enums también </li></ul><ul><li>Por último también tiene habilitado el soporte de tipos genéricos, iguales a los de Java. </li></ul>
  29. 29. Características I - JDK5 <ul><li>Es posible hacer uso de número de argumentos variables (varargs) mediante dos formas </li></ul><ul><ul><li>notación triple punto (JDK5)‏ </li></ul></ul><ul><ul><li>último argumento es de tipo Object[] </li></ul></ul>
  30. 30. Varargs en acción <ul><li>class Calculator { </li></ul><ul><li>def addAllGroovy( Object[] args ){ </li></ul><ul><li>int total = 0 </li></ul><ul><li>for( i in args ) { total += i } </li></ul><ul><li>total </li></ul><ul><li>} </li></ul><ul><li>def addAllJava( int... args ){ </li></ul><ul><li>int total = 0 </li></ul><ul><li>for( i in args ) { total += i } </li></ul><ul><li>total </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>Calculator c = new Calculator()‏ </li></ul><ul><li>assert c.addAllGroovy(1,2,3,4,5) == 15 </li></ul><ul><li>assert c.addAllJava(1,2,3,4,5) == 15 </li></ul>
  31. 31. <ul><ul><li>Características II </li></ul></ul><ul><ul><li>(explorando el vecindario)‏ </li></ul></ul>
  32. 32. Miscelaneos <ul><li>Parámetros con valor por omisión (PHP)‏ </li></ul><ul><li>Parámetros con nombre (Ruby), en realidad no hay tales, pero se puede reusar el truco del constructor por omisión de los POGOs)‏ </li></ul><ul><li>Sobrecarga de operadores através de convención de nombres </li></ul><ul><ul><li>+ plus()‏ </li></ul></ul><ul><ul><li>[] getAt() / putAt()‏ </li></ul></ul><ul><ul><li><< leftShift()‏ </li></ul></ul>
  33. 33. Closures <ul><li>Closures pueden ser interpretadas como bloques de código reusable, probablemente las hayas visto en otros lenguages como JavaScript o Ruby </li></ul><ul><li>Closures substituyen a las clases internas en la mayoría de los casos </li></ul><ul><li>Groovy permite “forzar el tipo” de una Closure a una interface de 1 solo método (proxy)‏ </li></ul><ul><li>Una closure tendrá un parámetro por omisión llamado it si es que no se defined parámetros para la misma </li></ul>
  34. 34. Ejemplos de Closures <ul><li>def greet = { name -> println “Hello $name” } </li></ul><ul><li>greet( “Groovy” )‏ </li></ul><ul><li>// prints Hello Groovy </li></ul><ul><li>def greet = { println “Hello $it” } </li></ul><ul><li>greet( “Groovy” )‏ </li></ul><ul><li>// prints Hello Groovy </li></ul><ul><li>def iCanHaveTypedParametersToo = { int x, int y -> </li></ul><ul><li>println “coordinates are ($x,$y)” </li></ul><ul><li>} </li></ul><ul><li>def myActionListener = { event -> </li></ul><ul><li>// do something cool with event </li></ul><ul><li>} as ActionListener </li></ul>
  35. 35. Currying <ul><li>Currying es una técnica de programación que transforma una función (o closure) de número de parámetros m a otra función con número de parámetros n , donde m > n, es decir reduce el número de parámetros, el valor de cada parámetro reducido queda fijado y no puede cambiarse </li></ul>
  36. 36. Currying en acción <ul><li>// un closure con 3 parámetros, el tercero es opcional dado </li></ul><ul><li>// que define un valor por omisión </li></ul><ul><li>def getSlope = { x, y, b = 0 -> </li></ul><ul><li>println &quot;x:${x} y:${y} b:${b}&quot; </li></ul><ul><li>(y - b) / x </li></ul><ul><li>} </li></ul><ul><li>assert 1 == getSlope( 2, 2 )‏ </li></ul><ul><li>def getSlopeX = getSlope.curry(5)‏ </li></ul><ul><li>assert 1 == getSlopeX(5)‏ </li></ul><ul><li>assert 0 == getSlopeX(2.5,2.5)‏ </li></ul><ul><li>// prints </li></ul><ul><li>// x:2 y:2 b:0 </li></ul><ul><li>// x:5 y:5 b:0 </li></ul><ul><li>// x:5 y:2.5 b:2.5 </li></ul>
  37. 37. Iteradores por doquier <ul><li>Asi como en Ruby, puedes hacer uso de iteradores prácticamente en cualquier contexto </li></ul><ul><li>Los iteradores dependen del poder que otrogan las closures, básicamente todos soportan el uso de closures como parámetros </li></ul><ul><li>Los iteradores literalmente dejan obsoletos a las operaciones de ciclos </li></ul>
  38. 38. Iteradores en acción <ul><li>def printIt = { println it } </li></ul><ul><li>// 3 ways to iterate from 1 to 5 </li></ul><ul><li>[1,2,3,4,5].each printIt </li></ul><ul><li>1.upto 5, printIt </li></ul><ul><li>(1..5).each printIt </li></ul><ul><li>// compare to a regular loop </li></ul><ul><li>for( i in [1,2,3,4,5] ) printIt(i)‏ </li></ul><ul><li>// same thing but use a Range </li></ul><ul><li>for( i in (1..5) ) printIt(i)‏ </li></ul><ul><li>[1,2,3,4,5].eachWithIndex { v, i -> println &quot;list[$i] => $v&quot; } </li></ul><ul><li>// list[0] => 1 </li></ul><ul><li>// list[1] => 2 </li></ul><ul><li>// list[2] => 3 </li></ul><ul><li>// list[3] => 4 </li></ul><ul><li>// list[4] => 5 </li></ul>
  39. 39. <ul><ul><li>Características III </li></ul></ul><ul><ul><li>(al infinito y mas allá!)‏ </li></ul></ul>
  40. 40. La palabra reservada as <ul><li>Permite “Groovy casting” , es decir, convertir un valor de tipoA a tipoB </li></ul><ul><ul><li>def intarray = [1,2,3] as int[ ] </li></ul></ul><ul><li>Permite forzar ( coerce ) un closure a una implemnetación anónima de una interface de un solo método </li></ul><ul><li>Permite forzar ( coerce ) un Map a una implementación de interface, clase abstracta o concreta </li></ul><ul><li>Permite crear alias en sentencias de importación </li></ul>
  41. 41. Algunos ejemplos de as <ul><li>import javax.swing.table.DefaultTableCellRenderer as DTCR </li></ul><ul><li>def myActionListener = { event -> </li></ul><ul><li>// do something cool with event </li></ul><ul><li>} as ActionListener </li></ul><ul><li>def renderer = [ </li></ul><ul><li>getTableCellRendererComponent: { t, v, s, f, r, c -> </li></ul><ul><li>// cool renderer code goes here </li></ul><ul><li>} </li></ul><ul><li>] as DTCR </li></ul><ul><li>// Nota esta técnica es similar a crear objetos en JavaScript </li></ul><ul><li>// con la notación JSON </li></ul>
  42. 42. Nuevos operadores <ul><li>?: (elvis) - un refinamiento del operador ternario </li></ul><ul><li>?. referencia segura – permite navegar un grafo de objetos sin temor a NPE </li></ul><ul><li><=> (spaceship) – compara dos valores </li></ul><ul><li>* (spread) – expande el contenido de una lista </li></ul><ul><li>*. (spread-dot) – aplica el método a todos los elementos de una lista </li></ul>
  43. 43. Navegando grafos de objetos <ul><li>GPath es a objetos lo que XPath es a XML </li></ul><ul><li>*. y ?. son bastante útiles en esta situación </li></ul><ul><li>Escribir expresiones Gpath es muy sencillo dado que los POGOs aceptan notación de punto y arreglo </li></ul>
  44. 44. Ejemplos de GPath <ul><li>class Person { </li></ul><ul><li>String name </li></ul><ul><li>int id </li></ul><ul><li>} </li></ul><ul><li>def persons = [ </li></ul><ul><li>new Person( name: 'Duke' , id: 1 ), </li></ul><ul><li>[name: 'Tux' , id: 2] as Person </li></ul><ul><li>] </li></ul><ul><li>assert [1,2] == persons.id </li></ul><ul><li>assert [ 'Duke' , 'Tux' ] == persons*.getName()‏ </li></ul><ul><li>assert null == persons[2]?.name </li></ul><ul><li>assert 'Duke' == persons[0].name ?: 'Groovy' </li></ul><ul><li>assert 'Groovy' == persons[2]?.name ?: 'Groovy' </li></ul>
  45. 45. Metaprogramación <ul><li>Puedes agregar métodos y propiedades a un objeto en tiempo de ejecución </li></ul><ul><li>Puedes interceptar llamadas a métodos o acceso de propiedades (similar a AOP pero sin tanto problema)‏ </li></ul><ul><li>Esto significa que Groovy ofrece un concepto similar a las clases abiertas en Ruby, es mas Groovy extiende clases finales como String e Integer </li></ul>
  46. 46. Ejemplo con categorías <ul><li>class Pouncer { </li></ul><ul><li>static pounce( Integer self ){ </li></ul><ul><li>def s = “Boing!&quot; </li></ul><ul><li>1.upto(self-1) { s += &quot; boing!&quot; } </li></ul><ul><li>s + &quot;!&quot; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>use ( Pouncer ){ </li></ul><ul><li>assert 3.pounce() == “Boing! boing! boing!&quot; </li></ul><ul><li>} </li></ul>
  47. 47. Ejemplo con Metaclases <ul><li>Integer. metaClass.pounce << { -> </li></ul><ul><li>def s = “Boing!&quot; </li></ul><ul><li>delegate.upto(delegate-1) { s += &quot; boing!&quot; } </li></ul><ul><li>s + &quot;!“ </li></ul><ul><li>} </li></ul><ul><li>assert 3.pounce() == “Boing! boing! boing!&quot; </li></ul>
  48. 48. Groovy y Spring
  49. 49. Varias Alternativas <ul><li>Compilar el código Groovy a código byte </li></ul><ul><li>Usar el módulo lang para referencia un archivo/script groovy </li></ul><ul><li>Insertar un script en la definición del contexto de aplicación (XML)‏ </li></ul>
  50. 50. 1. Compilar Groovy <ul><li>El compilador de Groovy puede ser invocado de distintas maneras </li></ul><ul><ul><li>comando groovyc </li></ul></ul><ul><ul><li>mediante una tarea de Ant (Groovyc)‏ </li></ul></ul><ul><ul><li>mediante Gmaven, plugin para Maven2 </li></ul></ul><ul><ul><li>Usando Gant (Groovy + Ant)‏ </li></ul></ul><ul><ul><li>plugins para IDEs (Eclipse, IDEA, NetBeans)‏ </li></ul></ul>
  51. 51. 2. El módulo lang <ul><li>Requiere el uso del schema spring-lang </li></ul><ul><li>Se recomienda usar ApplicationContext , también se puede usar BeanFactory pero hay mas trabajo manual que realizar </li></ul><ul><li>La Inyección de Dependencias funciona de la misma manera </li></ul>
  52. 52. Referencia a clase Groovy <ul><li><?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?> </li></ul><ul><li><beans xmlns=&quot;http://www.springframework.org/schema/beans&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance xmlns:lang=&quot;http://www.springframework.org/schema/lang &quot; </li></ul><ul><li>xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.5.xsd &quot;> </li></ul><ul><li><lang:groovy id=&quot;messenger&quot; script-source=&quot; classpath:Messenger.groovy &quot;> </li></ul><ul><li><lang:property name=&quot;message&quot; value=&quot;Hola Mundo!&quot; /> </li></ul><ul><li></lang:groovy> </li></ul><ul><li><bean id=&quot;bookingService&quot; class=&quot;x.y.DefaultBookingService&quot;> </li></ul><ul><li><property name=&quot;messenger&quot; ref=&quot;messenger&quot; /> </li></ul><ul><li></bean> </li></ul><ul><li></beans> </li></ul>
  53. 53. 3. Scripts en línea <ul><li>Requiere las mismas características que la opción anterior </li></ul><ul><li>Útil para crear implementaciones de clases ayundates como validadores </li></ul>
  54. 54. Ejemplo <ul><li><?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?> </li></ul><ul><li><beans xmlns=&quot;http://www.springframework.org/schema/beans&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance xmlns:lang=&quot;http://www.springframework.org/schema/lang &quot; </li></ul><ul><li>xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.5.xsd &quot;> </li></ul><ul><li><lang:groovy id=&quot;messenger&quot;> </li></ul><ul><li><lang:inline-script> </li></ul><ul><li>class GroovyMessenger implements Messenger { String message } </li></ul><ul><li></lang:inline-script> </li></ul><ul><li><lang:property name=&quot;message&quot; value=&quot;Hola Mundo!&quot; /> </li></ul><ul><li></lang:groovy> </li></ul><ul><li></beans> </li></ul>
  55. 55. Preguntas y Respuestas
  56. 56. Información adicional <ul><li>Groovy, guías, ejemplos </li></ul><ul><ul><li>http://groovy.codehaus.org </li></ul></ul><ul><li>Groovy Eclipse Plugin </li></ul><ul><ul><li>http://groovy.codehaus.org/Eclipse+Plugin </li></ul></ul><ul><li>Noticias Groovy </li></ul><ul><ul><li>http://aboutgroovy.com </li></ul></ul><ul><ul><li>http://groovyblogs.org </li></ul></ul><ul><ul><li>http://groovy.dzone.com </li></ul></ul><ul><ul><li>http://groovy.org.es </li></ul></ul><ul><li>Mi blog sobre Groovy/Java/Swing </li></ul><ul><ul><li>http://jroller.com/aalmiray </li></ul></ul>
  57. 57. Gracias!
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×