SlideShare uma empresa Scribd logo
1 de 84
Baixar para ler offline
Groovy Goodness 
PABLO ALBA CHAO 
#708090 
Porque Groovy no es Java sin puntos y comas
Ego-slide 
Pablo Alba 
CTO en Kaleidos Open Source 
http://kaleidos.net/708090/ 
http://albaontech.wordpress.com 
@_pabloalba_
Corrían los 90... 
Episode I
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 
}
Groovy 
Episode II
Groovy 
¿Qué sabe mucha gente sobre 
Groovy? 
● Los archivos llevan extensión .groovy 
● No lleva punto y coma al final 
● Es casi al 100% compatible con código java
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 
Groovy goodness... 
File file = new File("file.txt")) 
String everything = file.text
Groovy 
Groovy goodness... 
URL url = " http://google.com ".toURL() 
print url.text
Groovy 
Disclaimer 
● No quiero trollear a Java 
● Java 8 ha dado un paso de gigante 
● Pero Groovy mola más ;) 
● Espero que todo el mundo aprenda algo
Groovy 
Groovy Goodness: El libro 
Hubert A. Klein Ikkink (MrHaki) 
http://www.mrhaki.com/
Básicos y misceláneos de groovy 
Episode III
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 
Returns 
opcionales 
} 
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 
public class Saludador { 
private String usuario 
public String getUsuario() { 
Public 
opcionales 
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")
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 
} 
Tipos 
opcionales 
} 
Saludador saludador = new Saludador() 
saludador.setUsuario "Pablo" 
System.out.println saludador.saluda("Guillaume")
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 Atajo Saludador() 
para print 
saludador.setUsuario "Pablo" 
System.out.println saludador.saluda("Guillaume")
Básicos y misceláneos de groovy 
Getters y 
setters 
opcionales 
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")
Básicos y misceláneos de groovy 
class Saludador { 
private String usuario 
String saluda(String nombre){ 
"Hola " + nombre + ", yo soy " + usuario 
} 
Invocación al 
setter "mágica" 
} 
def saludador = new Saludador() 
saludador.setUsuario "Pablo" 
println saludador.saluda("Guillaume")
Básicos y misceláneos de groovy 
class Saludador { 
private String usuario 
Constructor por 
parámetros con 
nombre "mágico" 
String saluda(String nombre){ 
"Hola " + nombre + ", yo soy " + usuario 
} 
} 
def saludador = new Saludador() 
saludador.usuario = "Pablo" 
println saludador.saluda("Guillaume")
Básicos y misceláneos de groovy 
class Saludador { 
private String usuario 
Cadenas 
interpoladas 
(GStrings) 
String saluda(String nombre){ 
"Hola " + nombre + ", yo soy " + usuario 
} 
} 
def saludador = new Saludador(usuario:"Pablo") 
println saludador.saluda("Guillaume")
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 } 
} 
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 = 3 
println a 
a = "adios" // Error en tiempo de ejecución 
println a 
}
Básicos y misceláneos de groovy 
Estático. Si quieres. 
import groovy.transform.CompileStatic 
@CompileStatic 
void despidete() { 
Integer a = 3 
println a 
a = "adios" //Error en tiempo de compilación 
println 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 user1 = new User(nombre:"Pablo", edad:36) 
assert user1.class == User 
def user2 = [nombre:"Pablo", edad:36] as User 
assert user2.class == User 
User user3 = [nombre:"Pablo", edad:36] 
assert user3.class == User
Básicos y misceláneos de groovy 
Método with 
class 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.20090 
assert coordY == 12.90391
Básicos y misceláneos de groovy 
Listas (arrays) 
//JAVA 
String[] lista = new String[] { "uno", "dos", "tres" }; 
//GROOVY 
def lista = ['uno', 'dos', 'tres'] 
// Las listas tienen length, igual que los arrays 
assert 3 == lista.length 
// Además tienen size 
assert 3 == lista.size()
Básicos y misceláneos de groovy 
Mapas 
//JAVA 
Map <String, String> mapa = new HashMap<String, String>(); 
mapa.put("nombre", "Pablo"); 
mapa.put("apellido", "Alba"); 
//GROOVY 
def 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 
Hola.java 
class Hola { 
public static void main(String[] args){ 
System.out.println ("Hola " + args[0]); 
} 
} 
javac Hola.java 
java Hola Pablo
Básicos y misceláneos de groovy 
Groovy como lenguaje de scripting 
meDaIgualElNombre.groovy 
println "Hola " + args[0] 
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
Operadores 
Episode IV
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 normal 
def 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 
// ----------------------------------------------------------------------------
Strings 
Episode IV
Strings 
Comillas simples 
def s1 = 'Esto es una cadena, y podemos usar "comillas dobles"  
sin escaparlas’
Strings 
Comillas simples triples 
def s1 = ‘‘‘Esto es una cadena multilínea 
podemos escribir 
un montón de líneas 
sin preocuparnos de todo 
el lío de la concatenación 
’’’
Strings 
Slashy 
def s3 = /Podemos meter casi cualquier cosa en una "string" 'slasy' sin  
escaparla. Se usa mucho para expresiones regulares/
Strings 
Comillas dobles 
def s1 = "Esto es una cadena, y podemos usar ‘comillas simples’  
sin escaparlas"
Strings 
Comillas dobles triples 
def s1 = """Esto es una cadena multilínea 
podemos escribir 
un montón de líneas 
sin preocuparnos de todo 
el lío de la concatenación 
"""
Strings 
GStrings 
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"
Strings 
Invocación de métodos dinámica 
Adió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 
¿Es un número? 
'42.42'.isNumber() 
'42.42'.isDoble() 
'42.42'.isFloat() 
'42.42'.isInteger() 
'42.42'.isLong()
Strings 
Substrings 
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.
Strings 
Mayúsculas y minúsculas 
assert 'GROOVY' == 'groovy'.toUpperCase() 
assert 'groovy' == 'GROOVY'.toLowerCase() 
assert 'Groovy' == 'groovy'.capitalize()
Strings 
Base64 
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)
Closures 
Episode V
Closures 
Closure 
def sumador = {a, b -> a + b } 
assert sumador (3, 4) == 7 
assert sumador (‘H’, ‘ola’) == ‘Hola’
Closures 
"it" 
def doblador = { it * 2} 
assert doblador (3) == 6 
assert doblador (‘H’) == ‘HH’
Closures 
Valores por defecto 
def multiplicador = { int a, int b = 10 -> a * b} 
assert multiplicador (2, 3) == 6 
assert multiplicador (5) == 50 
//MissingMethodException 
//multiplicador (‘a’)
Closures 
Métodos como closures 
def logBase10 = Math.&log10 
assert logBase10(10) == 1 
def printer = System.out.&println 
printer "Hola"
Closures 
Curry (aplicación parcial) 
def restador = {a, b -> a - b } 
def invertir = restador.curry(0) 
assert invertir(4) == -4 
def restaUno = restador.rcurry(1) 
assert restaUno(4) == 3
Closures 
Memoize 
def slow = {n -> 
Thread.sleep(1000) 
return n 
} 
slow (1) 
slow (1) 
slow (1) 
slow (1) 
slow (1) 
// 5.894s
Closures 
Memoize 
def slow = {n -> 
Thread.sleep(1000) 
return n 
} 
def mem = slow.memoize() 
mem (1) 
mem (1) 
mem (1) 
mem (1) 
mem (1) 
// 1.922s
Listas y mapas 
Episode VI
Listas y mapas 
Listas: Buscando datos 
def patrulla = ['Cíclope', 'Lobezno', 'Tormenta', 
'Coloso', 'Rondador'] 
assert 'Lobezno' == list.find { it == 'Lobezno' } 
assert ['Tormenta', 'Rondador'] == list.findAll { it.size() > 7 } 
assert 2 == list.findLastIndexOf { it.size() == 7 }
Listas y mapas 
Listas: Rangos 
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 y mapas 
Listas: Iteraciones 
def patrulla = ['Cíclope', 'Lobezno', 'Tormenta', 'Coloso', 'Rondador'] 
for (i = 0; i < 5; i++) { 
println patrulla[i] 
} 
5.times{ 
println patrulla[it] 
} 
patrulla.each{ 
println it 
}
Listas y mapas 
Listas: Features ‘cool’ 
def list = [2,5,1,9,3,4,2,8,9] 
assert list.size() == 9 
assert list.sum() == 43 
assert list.max() == 9 
assert list.min() == 1 
assert list.count(9) == 2 
assert 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 y mapas 
Listas: Filter / Map / Reduce 
class Persona{ 
String nombre 
int 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 y mapas 
Mapas: Buscando datos 
def map = [nombre:"Logan", grupo: "Patrulla X"] 
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'
Listas y mapas 
Mapas: Features ‘cool’ 
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 == 1 
assert money.max { it.value }.key == ‘euro’
Ecosistema 
Episode VII
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/

Mais conteúdo relacionado

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

Seminario de Groovy y grails
Seminario de Groovy y grailsSeminario de Groovy y grails
Seminario de Groovy y grailsParadigma Digital
 
A lil' of Groovy for Ruby developers
A lil' of Groovy for Ruby developersA lil' of Groovy for Ruby developers
A lil' of Groovy for Ruby developersJose Juan R. Zuñiga
 
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y EficaciaRealizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y EficaciaAndres Almiray
 
Write gradle plugins escribir y publicar tus plugins de gradle made easy_
Write gradle plugins  escribir y publicar tus plugins de gradle  made easy_Write gradle plugins  escribir y publicar tus plugins de gradle  made easy_
Write gradle plugins escribir y publicar tus plugins de gradle made easy_Jorge Aguilera
 
Realizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficaciaRealizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficaciaSoftware Guru
 
Taller de programación clase #3
Taller de programación   clase #3Taller de programación   clase #3
Taller de programación clase #3Juan Cardona
 
1.2. kotlin (1)
1.2. kotlin (1)1.2. kotlin (1)
1.2. kotlin (1)xavazque2
 
Clase8 innerclasses
Clase8 innerclassesClase8 innerclasses
Clase8 innerclassesjorg_marq
 
Introduccion a grails en Campusparty
Introduccion a grails en CampuspartyIntroduccion a grails en Campusparty
Introduccion a grails en CampuspartyJose Juan R. Zuñiga
 
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11
CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11Miguel Angel
 

Semelhante a Groovy no es java sin puntos y comas - Codemotion Madrid 2014 (20)

Introducción a Groovy
Introducción a GroovyIntroducción a Groovy
Introducción a Groovy
 
Introduccion A Groovy
Introduccion A GroovyIntroduccion A Groovy
Introduccion A Groovy
 
Seminario de Groovy y grails
Seminario de Groovy y grailsSeminario de Groovy y grails
Seminario de Groovy y grails
 
A lil' of Groovy for Ruby developers
A lil' of Groovy for Ruby developersA lil' of Groovy for Ruby developers
A lil' of Groovy for Ruby developers
 
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y EficaciaRealizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
 
Write gradle plugins escribir y publicar tus plugins de gradle made easy_
Write gradle plugins  escribir y publicar tus plugins de gradle  made easy_Write gradle plugins  escribir y publicar tus plugins de gradle  made easy_
Write gradle plugins escribir y publicar tus plugins de gradle made easy_
 
Tests en Java con Groovy y Spock
Tests en Java con Groovy y SpockTests en Java con Groovy y Spock
Tests en Java con Groovy y Spock
 
Write Gradle Plugins
Write Gradle PluginsWrite Gradle Plugins
Write Gradle Plugins
 
Realizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficaciaRealizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficacia
 
Introducción a Groovy
Introducción a GroovyIntroducción a Groovy
Introducción a Groovy
 
Taller de programación clase #3
Taller de programación   clase #3Taller de programación   clase #3
Taller de programación clase #3
 
Unidad 5: Excepciones Ejercicio 1
Unidad 5: Excepciones Ejercicio 1Unidad 5: Excepciones Ejercicio 1
Unidad 5: Excepciones Ejercicio 1
 
Clase 7 objetos globales de javaScript
Clase 7 objetos globales de javaScriptClase 7 objetos globales de javaScript
Clase 7 objetos globales de javaScript
 
1.2. kotlin (1)
1.2. kotlin (1)1.2. kotlin (1)
1.2. kotlin (1)
 
1.2. kotlin
1.2. kotlin1.2. kotlin
1.2. kotlin
 
Clase8 innerclasses
Clase8 innerclassesClase8 innerclasses
Clase8 innerclasses
 
Introduccion a grails en Campusparty
Introduccion a grails en CampuspartyIntroduccion a grails en Campusparty
Introduccion a grails en Campusparty
 
Tarea sesion 08_gottlieb
Tarea sesion 08_gottliebTarea sesion 08_gottlieb
Tarea sesion 08_gottlieb
 
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11
CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11
 
Prac1
Prac1Prac1
Prac1
 

Último

Theme design in Plone 6 - World Plone Day 2024
Theme design in Plone 6 - World Plone Day 2024Theme design in Plone 6 - World Plone Day 2024
Theme design in Plone 6 - World Plone Day 2024Leonardo J. Caballero G.
 
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxMacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxcalzadillasluis134
 
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVOSISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVOELIAMARYTOVARFLOREZD
 
Semana 5-Conceptualización del lenguaje de programación C++
Semana 5-Conceptualización del lenguaje de programación C++Semana 5-Conceptualización del lenguaje de programación C++
Semana 5-Conceptualización del lenguaje de programación C++luzgaray6
 
Introducción a Plone CMS - World Plone Day 2024
Introducción a Plone CMS - World Plone Day 2024Introducción a Plone CMS - World Plone Day 2024
Introducción a Plone CMS - World Plone Day 2024Leonardo J. Caballero G.
 
Presentación de html, css y javascript.
Presentación  de html, css y javascript.Presentación  de html, css y javascript.
Presentación de html, css y javascript.CeteliInmaculada
 

Último (6)

Theme design in Plone 6 - World Plone Day 2024
Theme design in Plone 6 - World Plone Day 2024Theme design in Plone 6 - World Plone Day 2024
Theme design in Plone 6 - World Plone Day 2024
 
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxMacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
 
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVOSISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
 
Semana 5-Conceptualización del lenguaje de programación C++
Semana 5-Conceptualización del lenguaje de programación C++Semana 5-Conceptualización del lenguaje de programación C++
Semana 5-Conceptualización del lenguaje de programación C++
 
Introducción a Plone CMS - World Plone Day 2024
Introducción a Plone CMS - World Plone Day 2024Introducción a Plone CMS - World Plone Day 2024
Introducción a Plone CMS - World Plone Day 2024
 
Presentación de html, css y javascript.
Presentación  de html, css y javascript.Presentación  de html, css y javascript.
Presentación de html, css y javascript.
 

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

  • 1. Groovy Goodness PABLO ALBA CHAO #708090 Porque Groovy no es Java sin puntos y comas
  • 2. Ego-slide Pablo Alba CTO en Kaleidos Open Source http://kaleidos.net/708090/ http://albaontech.wordpress.com @_pabloalba_
  • 3. Corrían los 90... Episode I
  • 8. 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(); }
  • 9. 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 }
  • 11. Groovy ¿Qué sabe mucha gente sobre Groovy? ● Los archivos llevan extensión .groovy ● No lleva punto y coma al final ● Es casi al 100% compatible con código java
  • 12. Groovy <<a flat learning curve for Java developers>> Guillaume Laforge
  • 13. 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() ; }
  • 14. 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() }
  • 15. Groovy Groovy goodness... File file = new File("file.txt")) String everything = file.text
  • 16. Groovy Groovy goodness... URL url = " http://google.com ".toURL() print url.text
  • 17. Groovy Disclaimer ● No quiero trollear a Java ● Java 8 ha dado un paso de gigante ● Pero Groovy mola más ;) ● Espero que todo el mundo aprenda algo
  • 18. Groovy Groovy Goodness: El libro Hubert A. Klein Ikkink (MrHaki) http://www.mrhaki.com/
  • 19. Básicos y misceláneos de groovy Episode III
  • 20. 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
  • 21. 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
  • 22. 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 Returns opcionales } public String saluda(String nombre){ return "Hola " + nombre + ", yo soy " + usuario } } Saludador saludador = new Saludador() saludador.setUsuario "Pablo" System.out.println saludador.saluda("Guillaume")
  • 23. Básicos y misceláneos de groovy public class Saludador { private String usuario public String getUsuario() { Public opcionales 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")
  • 24. 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 } Tipos opcionales } Saludador saludador = new Saludador() saludador.setUsuario "Pablo" System.out.println saludador.saluda("Guillaume")
  • 25. 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 Atajo Saludador() para print saludador.setUsuario "Pablo" System.out.println saludador.saluda("Guillaume")
  • 26. Básicos y misceláneos de groovy Getters y setters opcionales 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")
  • 27. Básicos y misceláneos de groovy class Saludador { private String usuario String saluda(String nombre){ "Hola " + nombre + ", yo soy " + usuario } Invocación al setter "mágica" } def saludador = new Saludador() saludador.setUsuario "Pablo" println saludador.saluda("Guillaume")
  • 28. Básicos y misceláneos de groovy class Saludador { private String usuario Constructor por parámetros con nombre "mágico" String saluda(String nombre){ "Hola " + nombre + ", yo soy " + usuario } } def saludador = new Saludador() saludador.usuario = "Pablo" println saludador.saluda("Guillaume")
  • 29. Básicos y misceláneos de groovy class Saludador { private String usuario Cadenas interpoladas (GStrings) String saluda(String nombre){ "Hola " + nombre + ", yo soy " + usuario } } def saludador = new Saludador(usuario:"Pablo") println saludador.saluda("Guillaume")
  • 30. 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...
  • 31. 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 } } Saludador saludador = new Saludador(); saludador.setUsuario("Pablo"); System.out.println(saludador.saluda("Guillaume"));
  • 33. 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 = 3 println a a = "adios" // Error en tiempo de ejecución println a }
  • 34. Básicos y misceláneos de groovy Estático. Si quieres. import groovy.transform.CompileStatic @CompileStatic void despidete() { Integer a = 3 println a a = "adios" //Error en tiempo de compilación println a }
  • 35. Básicos y misceláneos de groovy Comparación de cadenas def a = "hola" assert "hola" == a
  • 36. Básicos y misceláneos de groovy Return opcional String suma(int a, int b) { a + b } assert suma(2, 3) == 5
  • 37. 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
  • 38. Básicos y misceláneos de groovy Casting automático class User{ String nombre Integer edad } def user1 = new User(nombre:"Pablo", edad:36) assert user1.class == User def user2 = [nombre:"Pablo", edad:36] as User assert user2.class == User User user3 = [nombre:"Pablo", edad:36] assert user3.class == User
  • 39. Básicos y misceláneos de groovy Método with class 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.' }
  • 40. 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.20090 assert coordY == 12.90391
  • 41. Básicos y misceláneos de groovy Listas (arrays) //JAVA String[] lista = new String[] { "uno", "dos", "tres" }; //GROOVY def lista = ['uno', 'dos', 'tres'] // Las listas tienen length, igual que los arrays assert 3 == lista.length // Además tienen size assert 3 == lista.size()
  • 42. Básicos y misceláneos de groovy Mapas //JAVA Map <String, String> mapa = new HashMap<String, String>(); mapa.put("nombre", "Pablo"); mapa.put("apellido", "Alba"); //GROOVY def mapa = [nombre:"Pablo", apellido:"Alba"]
  • 43. 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
  • 44. Básicos y misceláneos de groovy Groovy como lenguaje de scripting Hola.java class Hola { public static void main(String[] args){ System.out.println ("Hola " + args[0]); } } javac Hola.java java Hola Pablo
  • 45. Básicos y misceláneos de groovy Groovy como lenguaje de scripting meDaIgualElNombre.groovy println "Hola " + args[0] groovy meDaIgualElNombre.groovy
  • 46. Básicos y misceláneos de groovy Hook de cerrado addShutdownHook { println 'Fin del script' } println 'Inicio del script' Thread.sleep 100000
  • 48. 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
  • 49. Operadores Operador Elvis def sampleText // Operador ternario normal def 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!'
  • 50. 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
  • 51. Operadores Multiplicación de String println '-' * 80 // ----------------------------------------------------------------------------
  • 53. Strings Comillas simples def s1 = 'Esto es una cadena, y podemos usar "comillas dobles" sin escaparlas’
  • 54. Strings Comillas simples triples def s1 = ‘‘‘Esto es una cadena multilínea podemos escribir un montón de líneas sin preocuparnos de todo el lío de la concatenación ’’’
  • 55. Strings Slashy def s3 = /Podemos meter casi cualquier cosa en una "string" 'slasy' sin escaparla. Se usa mucho para expresiones regulares/
  • 56. Strings Comillas dobles def s1 = "Esto es una cadena, y podemos usar ‘comillas simples’ sin escaparlas"
  • 57. Strings Comillas dobles triples def s1 = """Esto es una cadena multilínea podemos escribir un montón de líneas sin preocuparnos de todo el lío de la concatenación """
  • 58. Strings GStrings 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"
  • 59. Strings Invocación de métodos dinámica Adió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')
  • 60. Strings ¿Es un número? '42.42'.isNumber() '42.42'.isDoble() '42.42'.isFloat() '42.42'.isInteger() '42.42'.isLong()
  • 61. Strings Substrings 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.
  • 62. Strings Mayúsculas y minúsculas assert 'GROOVY' == 'groovy'.toUpperCase() assert 'groovy' == 'GROOVY'.toLowerCase() assert 'Groovy' == 'groovy'.capitalize()
  • 63. Strings Base64 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)
  • 65. Closures Closure def sumador = {a, b -> a + b } assert sumador (3, 4) == 7 assert sumador (‘H’, ‘ola’) == ‘Hola’
  • 66. Closures "it" def doblador = { it * 2} assert doblador (3) == 6 assert doblador (‘H’) == ‘HH’
  • 67. Closures Valores por defecto def multiplicador = { int a, int b = 10 -> a * b} assert multiplicador (2, 3) == 6 assert multiplicador (5) == 50 //MissingMethodException //multiplicador (‘a’)
  • 68. Closures Métodos como closures def logBase10 = Math.&log10 assert logBase10(10) == 1 def printer = System.out.&println printer "Hola"
  • 69. Closures Curry (aplicación parcial) def restador = {a, b -> a - b } def invertir = restador.curry(0) assert invertir(4) == -4 def restaUno = restador.rcurry(1) assert restaUno(4) == 3
  • 70. Closures Memoize def slow = {n -> Thread.sleep(1000) return n } slow (1) slow (1) slow (1) slow (1) slow (1) // 5.894s
  • 71. Closures Memoize def slow = {n -> Thread.sleep(1000) return n } def mem = slow.memoize() mem (1) mem (1) mem (1) mem (1) mem (1) // 1.922s
  • 72. Listas y mapas Episode VI
  • 73. Listas y mapas Listas: Buscando datos def patrulla = ['Cíclope', 'Lobezno', 'Tormenta', 'Coloso', 'Rondador'] assert 'Lobezno' == list.find { it == 'Lobezno' } assert ['Tormenta', 'Rondador'] == list.findAll { it.size() > 7 } assert 2 == list.findLastIndexOf { it.size() == 7 }
  • 74. Listas y mapas Listas: Rangos 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]
  • 75. Listas y mapas Listas: Iteraciones def patrulla = ['Cíclope', 'Lobezno', 'Tormenta', 'Coloso', 'Rondador'] for (i = 0; i < 5; i++) { println patrulla[i] } 5.times{ println patrulla[it] } patrulla.each{ println it }
  • 76. Listas y mapas Listas: Features ‘cool’ def list = [2,5,1,9,3,4,2,8,9] assert list.size() == 9 assert list.sum() == 43 assert list.max() == 9 assert list.min() == 1 assert list.count(9) == 2 assert 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]
  • 77. Listas y mapas Listas: Filter / Map / Reduce class Persona{ String nombre int 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"
  • 78. Listas y mapas Mapas: Buscando datos def map = [nombre:"Logan", grupo: "Patrulla X"] 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'
  • 79. Listas y mapas Mapas: Features ‘cool’ 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 == 1 assert money.max { it.value }.key == ‘euro’
  • 82. No es java sin punto y coma
  • 83. ¡Gracias! ¡Gracias! http://kaleidos.net/708090/ http://albaontech.wordpress.com @_pabloalba_
  • 84. ¿Desea saber más? http://greachconf.com/ Madrid, April10th & 11th, 2015 http://www.meetup.com/madrid-gug/