Groovy no es java sin puntos y comas - Codemotion Madrid 2014
-
Upload
pablo-alba -
Category
Software
-
view
1.032 -
download
1
description
Transcript of 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
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 ;)● Espero que todo el mundo aprenda algo
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
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
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
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.'
}
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']
// Las listas tienen length, igual que los arraysassert 3 == lista.length
// Además tienen sizeassert 3 == lista.size()
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
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
class Hola { public static void main(String[] args){ System.out.println ("Hola " + args[0]); }}
Hola.java
javac Hola.java
java Hola Pablo
Básicos y misceláneos de groovy
Groovy como lenguaje de scripting
println "Hola " + args[0]
meDaIgualElNombre.groovy
groovy meDaIgualElNombre.groovy
Básicos y misceláneos de groovy
Hook de cerrado
addShutdownHook {println 'Fin del script'
}
println 'Inicio del script'Thread.sleep 100000
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 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!'
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 = 36
def s2 = "Naciste en el año ${2014 - edad}"
assert s2 == "Naciste en el año 1978"
GStrings
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')
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 logBase10 = Math.&log10
assert logBase10(10) == 1
def printer = System.out.&println
printer "Hola"
Métodos como closures
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)
Closures
def slow = {n -> Thread.sleep(1000) return n}
slow (1)slow (1)slow (1)slow (1)slow (1)
// 5.894s
Memoize
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
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']
assert ['Cíclope', 'Lobezno'] == patrulla[0..1]
assert ['Tormenta', 'Lobezno'] == patrulla[2..1]
assert ['Tormenta', 'Coloso', 'Rondador'] == patrulla[2..-1]
Listas: Rangos
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: 9)
]def nombres = personas.findAll { it.edad < 18 }
.collect { it.nombre.toUpperCase() }
.join(', ')
assert nombres == "LUCÍA, ISABEL"
Listas: Filter / Map / Reduce
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"]
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’
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, April10th & 11th, 2015
http://www.meetup.com/madrid-gug/