Groovy Goodness
PABLO ALBA CHAO
#708090
Porque Groovy no es Java sin puntos y comas
Ego-slide
Pablo AlbaCTO en Kaleidos Open Source
http://kaleidos.net/708090/
http://albaontech.wordpress.com
@_pabloalba_
Episode I
Corrían los 90...
Corrían los 90...
Corrían los 90...
Corrían los 90...
Corrían los 90...
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();
}
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
}
Episode II
Groovy
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?
Groovy
<<a flat learning curve for Java developers>>
Guillaume Laforge
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();
}
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()
}
Groovy
File file = new File("file.txt"))String everything = file.text
Groovy goodness...
Groovy
URL url = "http://google.com ".toURL()print url.text
Groovy goodness...
Groovy
● No quiero trollear a Java
Disclaimer
● Java 8 ha dado un paso de gigante● Pero Groovy mola más ;)
Groovy
Hubert A. Klein Ikkink (MrHaki)
http://www.mrhaki.com/
Groovy Goodness: El libro
Episode III
Básicos y misceláneos de groovy
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
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
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
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
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
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
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
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"
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"
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)
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...
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"));
Básicos y misceláneos de groovy
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
}
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
}
Básicos y misceláneos de groovy
Comparación de cadenas
def a = "hola"
assert "hola" == a
Básicos y misceláneos de groovy
Return opcional
String suma(int a, int b) { a + b}
assert suma(2, 3) == 5
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
Básicos y misceláneos de groovy
Listas (arrays)
//JAVAString[] lista = new String[] { "uno", "dos", "tres" };
//GROOVYdef lista = ['uno', 'dos', 'tres']
// En realidad son ArrayListlista.add(1000)assert 4 == lista.size()
Básicos y misceláneos de groovy
assert ["Murdock"] == equipo[2]
assert ["Hannibal", "Fenix"] == equipo[0..1]
assert ["Murdock", "Fenix"] == equipo[2..1]
assert ["Fenix", "Murdock", "MA"] == equipo[1..-1]
Listas: Sublistas
def equipo = ["Hannibal", "Fenix", "Murdock", "MA"]
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"]
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
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
Básicos y misceláneos de groovy
Groovy como lenguaje de scripting
println "Hola " + args[0]
meDaIgualElNombre.groovy
groovy meDaIgualElNombre.groovy Pablo
Episode IV
Operadores
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
Operadores
Operador Elvis
def text
// Operador ternario normaldef ternaryOutput = (text != null) ? text : 'Hello Groovy!'
// Operador Elvis// Esto se lee: 'Si text no es nulo, asigna text a// elvisOutput. De otra forma, asigna 'Viva Las Vegas!' a elvisOutput.def elvisOutput = text ?: 'Viva Las Vegas!'
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
Operadores
Multiplicación de String
println '-' * 80
// ----------------------------------------------------------------------------
Episode IV
Strings
Strings
def s1 = 'Esto es una cadena, y podemos usar "comillas dobles" \sin escaparlas’
Comillas simples
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
Strings
def s3 = /Podemos meter casi cualquier cosa en una "string" 'slasy' sin \escaparla. Se usa mucho para expresiones regulares/
Slashy
Strings
def s1 = "Esto es una cadena, y podemos usar ‘comillas simples’ \sin escaparlas"
Comillas dobles
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
Strings
def nombre = "Pablo"
def s1 = "Hola, $nombre"
assert s1 == "Hola, Pablo"
def edad = 37
def s2 = "En el 2050 tendrás ${edad + 34} años"
assert s2 == "En el 2050 tendrás 71 años"
GStrings
Strings
'42.42'.isNumber()
'42.42'.isDoble()
'42.42'.isFloat()
'42.42'.isInteger()
'42.42'.isLong()
¿Es un número?
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
Strings
assert 'GROOVY' == 'groovy'.toUpperCase()
assert 'groovy' == 'GROOVY'.toLowerCase()
assert 'Groovy' == 'groovy'.capitalize()
Mayúsculas y minúsculas
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
Episode V
Closures
Closures
def sumador = {a, b -> a + b }
assert sumador (3, 4) == 7
assert sumador (‘H’, ‘ola’) == ‘Hola’
Closure
Closures
def doblador = { it * 2}
assert doblador (3) == 6
assert doblador (‘H’) == ‘HH’
"it"
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
Closures
def printer = System.out.&println
printer "Hola"
Métodos como closures
Episode VI
Listas y mapas
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']
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}
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’
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: 11)
]def nombres = personas.findAll { it.edad < 18 }
.collect { it.nombre.toUpperCase() }
.join(', ')
assert nombres == "LUCÍA, ISABEL"
Listas: Filter / Map / Reduce
Episode VII
Ecosistema
Ecosistema
No es java sin punto y coma
¡Gracias!
¡Gracias!http://kaleidos.net/708090/
http://albaontech.wordpress.com
@_pabloalba_
¿Desea saber más?
http://greachconf.com/
Madrid, April 8th & 9th, 2016
http://www.meetup.com/madrid-gug/