SlideShare una empresa de Scribd logo
1 de 84
Descargar para leer sin conexión
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/

Más contenido relacionado

Similar 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
 

Similar 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

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
 
Instalacion de servicios windows, configuracion y aplicacion.
Instalacion de servicios windows, configuracion y aplicacion.Instalacion de servicios windows, configuracion y aplicacion.
Instalacion de servicios windows, configuracion y aplicacion.CZSOTEC
 
Webinar Resolucion2335 de 2023 Kubapp.pdf
Webinar Resolucion2335 de 2023 Kubapp.pdfWebinar Resolucion2335 de 2023 Kubapp.pdf
Webinar Resolucion2335 de 2023 Kubapp.pdfAnaRosaMontenegro
 
Delitos informáticos en Slideshare.pptx
Delitos informáticos en  Slideshare.pptxDelitos informáticos en  Slideshare.pptx
Delitos informáticos en Slideshare.pptxmaykolmagallanes012
 
Se realiza instalacion y configuraacion servicios Windows
Se realiza instalacion y configuraacion servicios WindowsSe realiza instalacion y configuraacion servicios Windows
Se realiza instalacion y configuraacion servicios WindowsCZSOTEC
 
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxMacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxcalzadillasluis134
 

Último (6)

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
 
Instalacion de servicios windows, configuracion y aplicacion.
Instalacion de servicios windows, configuracion y aplicacion.Instalacion de servicios windows, configuracion y aplicacion.
Instalacion de servicios windows, configuracion y aplicacion.
 
Webinar Resolucion2335 de 2023 Kubapp.pdf
Webinar Resolucion2335 de 2023 Kubapp.pdfWebinar Resolucion2335 de 2023 Kubapp.pdf
Webinar Resolucion2335 de 2023 Kubapp.pdf
 
Delitos informáticos en Slideshare.pptx
Delitos informáticos en  Slideshare.pptxDelitos informáticos en  Slideshare.pptx
Delitos informáticos en Slideshare.pptx
 
Se realiza instalacion y configuraacion servicios Windows
Se realiza instalacion y configuraacion servicios WindowsSe realiza instalacion y configuraacion servicios Windows
Se realiza instalacion y configuraacion servicios Windows
 
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxMacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
 

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/