Groovy no es java sin puntos y comas - Codemotion Madrid 2014

84
Groovy Goodness PABLO ALBA CHAO #708090 Porque Groovy no es Java sin puntos y comas

description

Charla de Codemotion Madrid 2014 Vídeo disponible en: https://www.youtube.com/watch?v=GqfYw0lcANw Groovy es un lenguaje magnífico, muy divertido de programar, que hace que trabajar con la JVM sea un placer. A menudo se habla de que tiene una curva de aprendizaje casi nula desde Java. El problema es que esto lleva a que se desconozca gran parte de su potencial. En esta charla quiero comentar a modo de "pildoras" algunos de los aspectos más interesantes de groovy. Para ello me basaré en mi propia experiencia, y en el magnífico libro "Groovy Goodness Notebook".

Transcript of Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Page 1: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Groovy Goodness

PABLO ALBA CHAO

#708090

Porque Groovy no es Java sin puntos y comas

Page 2: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Ego-slide

Pablo AlbaCTO en Kaleidos Open Source

http://kaleidos.net/708090/

http://albaontech.wordpress.com

@_pabloalba_

Page 3: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Episode I

Corrían los 90...

Page 4: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Corrían los 90...

Page 5: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Corrían los 90...

Page 6: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Corrían los 90...

Page 7: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Corrían los 90...

Page 8: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Corrían los 90...

BufferedReader br = new BufferedReader(new FileReader("file.txt"));try {

StringBuilder sb = new StringBuilder();String line = br.readLine();

while (line != null) { sb.append(line); sb.append(System.lineSeparator()); line = br.readLine();

}String everything = sb.toString();

} finally {br.close();

}

Page 9: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Corrían los 90...import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL; public class Main { public static void main(String[] args) { try { URL google = new URL("http://www.google.com/"); BufferedReader in = new BufferedReader(newInputStreamReader(google.openStream())); String inputLine; while ((inputLine = in.readLine()) != null) System.out.println(inputLine); } in.close(); } catch (MalformedURLException me) { System.out.println(me); } catch (IOException ioe) { System.out.println(ioe); } }//end main

}

Page 10: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Episode II

Groovy

Page 11: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Groovy

● Los archivos llevan extensión .groovy● No lleva punto y coma al final● Es casi al 100% compatible con código java

¿Qué sabe mucha gente sobre Groovy?

Page 12: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Groovy

<<a flat learning curve for Java developers>>

Guillaume Laforge

Page 13: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Groovy

BufferedReader br = new BufferedReader(new FileReader("file.txt"));try {

StringBuilder sb = new StringBuilder();String line = br.readLine() ;

while (line != null) { sb.append(line) ; sb.append(System.lineSeparator()) ; line = br.readLine() ;

}String everything = sb.toString() ;

} finally {br.close();

}

Page 14: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Groovy

BufferedReader br = new BufferedReader(new FileReader(" file.txt"))try {

StringBuilder sb = new StringBuilder()String line = br.readLine()

while (line != null) { sb.append(line) sb.append(System.lineSeparator()) line = br.readLine()

}String everything = sb.toString()

} finally {br.close()

}

Page 15: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Groovy

File file = new File("file.txt"))String everything = file.text

Groovy goodness...

Page 16: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Groovy

URL url = "http://google.com ".toURL()print url.text

Groovy goodness...

Page 17: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Groovy

● No quiero trollear a Java

Disclaimer

● Java 8 ha dado un paso de gigante● Pero Groovy mola más ;)● Espero que todo el mundo aprenda algo

Page 18: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Groovy

Hubert A. Klein Ikkink (MrHaki)

http://www.mrhaki.com/

Groovy Goodness: El libro

Page 19: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Episode III

Básicos y misceláneos de groovy

Page 20: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

public class Saludador {private String usuario;

public String getUsuario() {return usuario;

}

public void setUsuario(usuario) {this.usuario = usuario;

}

public String saluda(String nombre){return ("Hola " + nombre + ", yo soy " + usuario);

}}

Saludador saludador = new Saludador();

saludador.setUsuario("Pablo");

System.out.println(saludador.saluda("Guillaume"));

Puntos y coma opcionales

Page 21: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

public class Saludador {private String usuario

public String getUsuario() {return usuario

}

public void setUsuario(usuario) {this.usuario = usuario

}

public String saluda(String nombre){return ("Hola " + nombre + ", yo soy " + usuario)

}}

Saludador saludador = new Saludador()

saludador.setUsuario("Pablo")

System.out.println(saludador.saluda("Guillaume"))

Paréntesis opcionales

Page 22: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

public class Saludador {private String usuario

public String getUsuario() {return usuario

}

public void setUsuario(usuario) {this.usuario = usuario

}

public String saluda(String nombre){return "Hola " + nombre + ", yo soy " + usuario

}}

Saludador saludador = new Saludador()

saludador.setUsuario "Pablo"

System.out.println saludador.saluda("Guillaume")

Returns opcionales

Page 23: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

public class Saludador {private String usuario

public String getUsuario() {usuario

}

public void setUsuario(usuario) {this.usuario = usuario

}

public String saluda(String nombre){"Hola " + nombre + ", yo soy " + usuario

}}

Saludador saludador = new Saludador()

saludador.setUsuario "Pablo"

System.out.println saludador.saluda("Guillaume")

Public opcionales

Page 24: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

class Saludador {private String usuario

String getUsuario() {usuario

}

void setUsuario(usuario) {this.usuario = usuario

}

String saluda(String nombre){"Hola " + nombre + ", yo soy " + usuario

}}

Saludador saludador = new Saludador()

saludador.setUsuario "Pablo"

System.out.println saludador.saluda("Guillaume")

Tipos opcionales

Page 25: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

class Saludador {private String usuario

String getUsuario() {usuario

}

void setUsuario(usuario) {this.usuario = usuario

}

String saluda(String nombre){"Hola " + nombre + ", yo soy " + usuario

}}

def saludador = new Saludador()

saludador.setUsuario "Pablo"

System.out.println saludador.saluda("Guillaume")

Atajo para print

Page 26: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

class Saludador {private String usuario

String getUsuario() {usuario

}

void setUsuario(usuario) {this.usuario = usuario

}

String saluda(String nombre){"Hola " + nombre + ", yo soy " + usuario

}}

def saludador = new Saludador()

saludador.setUsuario "Pablo"

println saludador.saluda("Guillaume")

Getters y setters opcionales

Page 27: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

class Saludador {private String usuario

String saluda(String nombre){"Hola " + nombre + ", yo soy " + usuario

}}

def saludador = new Saludador()

saludador.setUsuario "Pablo"

println saludador.saluda("Guillaume")

Invocación al setter "mágica"

Page 28: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

class Saludador {private String usuario

String saluda(String nombre){"Hola " + nombre + ", yo soy " + usuario

}}

def saludador = new Saludador()

saludador.usuario = "Pablo"

println saludador.saluda("Guillaume")

Constructor por parámetros con nombre "mágico"

Page 29: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

class Saludador {private String usuario

String saluda(String nombre){"Hola " + nombre + ", yo soy " + usuario

}}

def saludador = new Saludador(usuario:"Pablo")

println saludador.saluda("Guillaume")

Cadenas interpoladas (GStrings)

Page 30: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

class Saludador {private String usuario

String saluda(String nombre){"Hola $nombre, yo soy $usuario"

}}

def saludador = new Saludador(usuario:"Pablo")

println saludador.saluda("Guillaume")

Reformateamos...

Page 31: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

class Saludador { private String usuario

String saluda(String nombre){"Hola $nombre, yo soy $usuario"

}}

def saludador = new Saludador(usuario:"Pablo")println saludador.saluda("Guillaume")

public class Saludador {private String usuario;

public String getUsuario() {return usuario;

}

public void setUsuario(usuario) {this.usuario = usuario;

}

public String saluda(String nombre){return ("Hola " + nombre + ", yo soy " + usuario);

}}

Saludador saludador = new Saludador();

saludador.setUsuario("Pablo");

System.out.println(saludador.saluda("Guillaume"));

Page 32: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

Page 33: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

Dinámico

def saluda() { def a = "hola mundo" println a a = 3 print a}

void despidete() {Integer a = 3println aa = "adios" // Error en tiempo de ejecuciónprintln a

}

Page 34: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

Estático. Si quieres.

import groovy.transform.CompileStatic

@CompileStaticvoid despidete() {

Integer a = 3println aa = "adios" //Error en tiempo de compilaciónprintln a

}

Page 35: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

Comparación de cadenas

def a = "hola"

assert "hola" == a

Page 36: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

Return opcional

String suma(int a, int b) { a + b}

assert suma(2, 3) == 5

Page 37: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

Casting automático

String diTuNombre() { Integer a = 3}

def a = diTuNombre() assert a == "3"assert a.class == String

Page 38: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

Casting automático

class User{ String nombre Integer edad}

def user2 = [nombre:"Pablo", edad:36] as Userassert user2.class == User

def user1 = new User(nombre:"Pablo", edad:36)assert user1.class == User

User user3 = [nombre:"Pablo", edad:36]assert user3.class == User

Page 39: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

Método withclass User{ String nombre Integer edad} def user = new User()user.with {

nombre = "Pablo"edad = 36

}

def sb = new StringBuilder()sb.with {

append 'Just another way to add ' append 'strings to the StringBuilder ’ append 'object.'

}

Page 40: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

Asignación múltiple / Retorno múltiple

def iAmHere() { [29.20090, 12.90391]}

def (coordX, coordY) = iAmHere()

assert coordX == 29.20090assert coordY == 12.90391

Page 41: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

Listas (arrays)

//JAVAString[] lista = new String[] { "uno", "dos", "tres" };

//GROOVYdef lista = ['uno', 'dos', 'tres']

// Las listas tienen length, igual que los arraysassert 3 == lista.length

// Además tienen sizeassert 3 == lista.size()

Page 42: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

Mapas

//JAVAMap <String, String> mapa = new HashMap<String, String>();mapa.put("nombre", "Pablo");mapa.put("apellido", "Alba");

//GROOVYdef mapa = [nombre:"Pablo", apellido:"Alba"]

Page 43: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

La verdad en Groovy

assert !( null )assert !( "" )assert !( [] )assert !( [:] )assert !( 0 )

assert new Object()assert "string"assert [1, 2, 3]assert [a:1]assert 12345

Page 44: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

Groovy como lenguaje de scripting

class Hola { public static void main(String[] args){ System.out.println ("Hola " + args[0]); }}

Hola.java

javac Hola.java

java Hola Pablo

Page 45: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

Groovy como lenguaje de scripting

println "Hola " + args[0]

meDaIgualElNombre.groovy

groovy meDaIgualElNombre.groovy

Page 46: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Básicos y misceláneos de groovy

Hook de cerrado

addShutdownHook {println 'Fin del script'

}

println 'Inicio del script'Thread.sleep 100000

Page 47: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Episode IV

Operadores

Page 48: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Operadores

Navegación segura

// Modo "JAVA"if (company != null && company.getAddress() != null && company.getAddress().getStreet() != null) { println company.address.street.name}

// Modo "Groovy"println company?.address?.street?.name

Page 49: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Operadores

Operador Elvis

def sampleText

// Operador ternario normaldef ternaryOutput = (sampleText != null) ? sampleText : 'Hello Groovy!'

// Operador Elvis// Esto se lee: 'Si sampleText no es nulo, asigna sampleText a// elvisOutput. De otra forma, asigna 'Viva Las Vegas!' a elvisOutput.def elvisOutput = sampleText ?: 'Viva Las Vegas!'

Page 50: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Operadores

In

// Modo "JAVA"String[] list = {"a", "b", "c"};assert Arrays.asList(list).contains("a")

// Modo "GROOVY"def list = ["a", "b", "c"]assert "a" in list

Page 51: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Operadores

Multiplicación de String

println '-' * 80

// ----------------------------------------------------------------------------

Page 52: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Episode IV

Strings

Page 53: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Strings

def s1 = 'Esto es una cadena, y podemos usar "comillas dobles" \sin escaparlas’

Comillas simples

Page 54: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Strings

def s1 = ‘‘‘Esto es una cadena multilíneapodemos escribirun montón de líneassin preocuparnos de todoel lío de la concatenación’’’

Comillas simples triples

Page 55: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Strings

def s3 = /Podemos meter casi cualquier cosa en una "string" 'slasy' sin \escaparla. Se usa mucho para expresiones regulares/

Slashy

Page 56: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Strings

def s1 = "Esto es una cadena, y podemos usar ‘comillas simples’ \sin escaparlas"

Comillas dobles

Page 57: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Strings

def s1 = """Esto es una cadena multilíneapodemos escribirun montón de líneassin preocuparnos de todoel lío de la concatenación"""

Comillas dobles triples

Page 58: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Strings

def nombre = "Pablo"

def s1 = "Hola, $nombre"

assert s1 == "Hola, Pablo"

def edad = 36

def s2 = "Naciste en el año ${2014 - edad}"

assert s2 == "Naciste en el año 1978"

GStrings

Page 59: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Strings

Invocación de métodos dinámicaAdiós, Reflection!

class Simple {def hola(nombre) {

"Hola $nombre, ¿cómo estás?"}

}

def s = new Simple()

def method = 'hola'

assert 'Hola Pablo, ¿cómo estás?' == s."$method"('Pablo')

Page 60: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Strings

'42.42'.isNumber()

'42.42'.isDoble()

'42.42'.isFloat()

'42.42'.isInteger()

'42.42'.isLong()

¿Es un número?

Page 61: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Strings

def s = 'Acceder a las cadenas en Groovy es fácil.'

assert 'A' == s.getAt(0)

// Las cadenas funcionan como listas

assert 'A' == s[0]

assert 'Groovy' == s[25..30] // Podemos usar rangos.

Substrings

Page 62: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Strings

assert 'GROOVY' == 'groovy'.toUpperCase()

assert 'groovy' == 'GROOVY'.toLowerCase()

assert 'Groovy' == 'groovy'.capitalize()

Mayúsculas y minúsculas

Page 63: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Strings

def s = 'Esto en otros lenguajes es un dolor...'

String encoded = s.bytes.encodeBase64().toString()

assert 'RXN0byBlbiBvdHJvcyBsZW5ndWFqZXMgZXMgdW4gZG9sb3IuLi4=' == encoded

byte[] decoded = encoded.decodeBase64()

assert s == new String(decoded)

Base64

Page 64: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Episode V

Closures

Page 65: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Closures

def sumador = {a, b -> a + b }

assert sumador (3, 4) == 7

assert sumador (‘H’, ‘ola’) == ‘Hola’

Closure

Page 66: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Closures

def doblador = { it * 2}

assert doblador (3) == 6

assert doblador (‘H’) == ‘HH’

"it"

Page 67: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Closures

def multiplicador = { int a, int b = 10 -> a * b}

assert multiplicador (2, 3) == 6

assert multiplicador (5) == 50

//MissingMethodException//multiplicador (‘a’)

Valores por defecto

Page 68: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Closures

def logBase10 = Math.&log10

assert logBase10(10) == 1

def printer = System.out.&println

printer "Hola"

Métodos como closures

Page 69: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Closures

def restador = {a, b -> a - b }

def invertir = restador.curry(0)

assert invertir(4) == -4

def restaUno = restador.rcurry(1)

assert restaUno(4) == 3

Curry (aplicación parcial)

Page 70: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Closures

def slow = {n -> Thread.sleep(1000) return n}

slow (1)slow (1)slow (1)slow (1)slow (1)

// 5.894s

Memoize

Page 71: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Closures

def slow = {n -> Thread.sleep(1000) return n}

def mem = slow.memoize()

mem (1)mem (1)mem (1)mem (1)mem (1)// 1.922s

Memoize

Page 72: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Episode VI

Listas y mapas

Page 73: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Listas y mapas

assert 'Lobezno' == list.find { it == 'Lobezno' }

assert ['Tormenta', 'Rondador'] == list.findAll { it.size() > 7 }

assert 2 == list.findLastIndexOf { it.size() == 7 }

Listas: Buscando datosdef patrulla = ['Cíclope', 'Lobezno', 'Tormenta', 'Coloso', 'Rondador']

Page 74: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Listas y mapas

def patrulla = ['Cíclope', 'Lobezno', 'Tormenta', 'Coloso', 'Rondador']

assert ['Cíclope', 'Lobezno'] == patrulla[0..1]

assert ['Tormenta', 'Lobezno'] == patrulla[2..1]

assert ['Tormenta', 'Coloso', 'Rondador'] == patrulla[2..-1]

Listas: Rangos

Page 75: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Listas y mapas

def patrulla = ['Cíclope', 'Lobezno', 'Tormenta', 'Coloso', 'Rondador']

Listas: Iteraciones

for (i = 0; i < 5; i++) { println patrulla[i]}

5.times{ println patrulla[it]}

patrulla.each{ println it}

Page 76: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Listas y mapas

def list = [2,5,1,9,3,4,2,8,9]

assert list.size() == 9assert list.sum() == 43assert list.max() == 9assert list.min() == 1assert list.count(9) == 2assert list.count{ it < 5 } == 5

list.sort()assert list == [1, 2, 2, 3, 4, 5, 8, 9, 9]

list.unique()assert list == [1, 2, 3, 4, 5, 8, 9]

Listas: Features ‘cool’

Page 77: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Listas y mapas

class Persona{String nombreint edad

}def personas = [

new Persona(nombre: "Pablo", edad: 36),new Persona(nombre: "Lucía", edad: 12),new Persona(nombre: "Isabel", edad: 9)

]def nombres = personas.findAll { it.edad < 18 }

.collect { it.nombre.toUpperCase() }

.join(', ')

assert nombres == "LUCÍA, ISABEL"

Listas: Filter / Map / Reduce

Page 78: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Listas y mapas

def found = map.find { key, value -> key == 'nombre' }

assert found.key == 'nombre' assert found.value == 'Logan'

found = map.find { it.value =~ /tru/ }

assert found.key == 'grupo' found.value == 'Patrulla X'

Mapas: Buscando datosdef map = [nombre:"Logan", grupo: "Patrulla X"]

Page 79: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Listas y mapas

def m1 = [user: 'palba', age: 36]def m2 = [user: 'palba', name: 'Pablo']def m3 = [user: 'carlos', age: 36]

assert m1 - m2 == [age: 36]assert m1 - m3 == [user: 'palba']

def money = [euro: 166.386, centimo: 1.664, peseta: 1]

assert money.min { it.value }.value == 1assert money.max { it.value }.key == ‘euro’

Mapas: Features ‘cool’

Page 80: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Episode VII

Ecosistema

Page 81: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

Ecosistema

Page 82: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

No es java sin punto y coma

Page 83: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

¡Gracias!

¡Gracias!http://kaleidos.net/708090/

http://albaontech.wordpress.com

@_pabloalba_

Page 84: Groovy no es java sin puntos y comas - Codemotion Madrid 2014

¿Desea saber más?

http://greachconf.com/

Madrid, April10th & 11th, 2015

http://www.meetup.com/madrid-gug/