SlideShare a Scribd company logo
1 of 115
Download to read offline
De Java a Groovy:
¡Hora de Aventuras!
Iván López @ilopmar
➢ Iván López @ilopmar
➢ Groovy & Grails developer
➢ Coordinador de
@madridgug
➢ Organizador de Greach
@greachconf
http://greachconf.com
➢ Speaker: SpringOne 2GX, GR8Conf,
GGX, Codemotion, GeeCon, jDays,
Spring IO, Greach, ConFess,...
Sobre mí...
1.
Qué es Groovy
“Groovy es un lenguaje dinámico poderoso, opcionalmente
tipado, con capacidad de tipado y compilación estáticos para la
plataforma Java centrado en multiplicar la productividad de
los desarrolladores gracias a una sintaxis concisa, familiar y
fácil de aprender.
Se integra sin problemas con cualquier programa Java e
inmediatamente proporciona a tu aplicación poderosas
características como capacidades de scripting, DSLs,
metaprogramación en runtime y compile-time y programación
funcional.
– Web de Groovy
“Groovy es un lenguaje dinámico poderoso, opcionalmente
tipado, con capacidad de tipado y compilación estáticos para la
plataforma Java centrado en multiplicar la productividad de
los desarrolladores gracias a una sintaxis concisa, familiar y
fácil de aprender.
Se integra sin problemas con cualquier programa Java e
inmediatamente proporciona a tu aplicación poderosas
características como capacidades de scripting, DSLs,
metaprogramación en runtime y compile-time y programación
funcional.
– Web de Groovy
“Groovy es un lenguaje dinámico poderoso, opcionalmente
tipado, con capacidad de tipado y compilación estáticos para la
plataforma Java centrado en multiplicar la productividad de
los desarrolladores gracias a una sintaxis concisa, familiar y
fácil de aprender.
Se integra sin problemas con cualquier programa Java e
inmediatamente proporciona a tu aplicación poderosas
características como capacidades de scripting, DSLs,
metaprogramación en runtime y compile-time y programación
funcional.
– Web de Groovy
“Groovy es un lenguaje dinámico poderoso, opcionalmente
tipado, con capacidad de tipado y compilación estáticos para la
plataforma Java centrado en multiplicar la productividad de
los desarrolladores gracias a una sintaxis concisa, familiar y
fácil de aprender.
Se integra sin problemas con cualquier programa Java e
inmediatamente proporciona a tu aplicación poderosas
características como capacidades de scripting, DSLs,
metaprogramación en runtime y compile-time y programación
funcional.
– Web de Groovy
“Groovy es un lenguaje dinámico poderoso, opcionalmente
tipado, con capacidad de tipado y compilación estáticos para la
plataforma Java centrado en multiplicar la productividad de
los desarrolladores gracias a una sintaxis concisa, familiar y
fácil de aprender.
Se integra sin problemas con cualquier programa Java e
inmediatamente proporciona a tu aplicación poderosas
características como capacidades de scripting, DSLs,
metaprogramación en runtime y compile-time y programación
funcional.
– Web de Groovy
“Groovy es un lenguaje dinámico poderoso, opcionalmente
tipado, con capacidad de tipado y compilación estáticos para la
plataforma Java centrado en multiplicar la productividad de
los desarrolladores gracias a una sintaxis concisa, familiar y
fácil de aprender.
Se integra sin problemas con cualquier programa Java e
inmediatamente proporciona a tu aplicación poderosas
características como capacidades de scripting, DSLs,
metaprogramación en runtime y compile-time y programación
funcional.
– Web de Groovy
“Groovy es un lenguaje dinámico poderoso, opcionalmente
tipado, con capacidad de tipado y compilación estáticos para la
plataforma Java centrado en multiplicar la productividad de
los desarrolladores gracias a una sintaxis concisa, familiar y
fácil de aprender.
Se integra sin problemas con cualquier programa Java e
inmediatamente proporciona a tu aplicación poderosas
características como capacidades de scripting, DSLs,
metaprogramación en runtime y compile-time y programación
funcional.
– Web de Groovy
“Groovy es un lenguaje dinámico poderoso, opcionalmente
tipado, con capacidad de tipado y compilación estáticos para la
plataforma Java centrado en multiplicar la productividad de
los desarrolladores gracias a una sintaxis concisa, familiar y
fácil de aprender.
Se integra sin problemas con cualquier programa Java e
inmediatamente proporciona a tu aplicación poderosas
características como capacidades de scripting, DSLs,
metaprogramación en runtime y compile-time y programación
funcional.
– Web de Groovy
“Groovy es un lenguaje dinámico poderoso, opcionalmente
tipado, con capacidad de tipado y compilación estáticos para la
plataforma Java centrado en multiplicar la productividad de
los desarrolladores gracias a una sintaxis concisa, familiar y
fácil de aprender.
Se integra sin problemas con cualquier programa Java e
inmediatamente proporciona a tu aplicación poderosas
características como capacidades de scripting, DSLs,
metaprogramación en runtime y compile-time y programación
funcional.
– Web de Groovy
“Groovy es un lenguaje dinámico poderoso, opcionalmente
tipado, con capacidad de tipado y compilación estáticos para la
plataforma Java centrado en multiplicar la productividad de
los desarrolladores gracias a una sintaxis concisa, familiar y
fácil de aprender.
Se integra sin problemas con cualquier programa Java e
inmediatamente proporciona a tu aplicación poderosas
características como capacidades de scripting, DSLs,
metaprogramación en runtime y compile-time y programación
funcional.
– Web de Groovy
“Groovy es un lenguaje dinámico poderoso, opcionalmente
tipado, con capacidad de tipado y compilación estáticos para la
plataforma Java centrado en multiplicar la productividad de
los desarrolladores gracias a una sintaxis concisa, familiar y
fácil de aprender.
Se integra sin problemas con cualquier programa Java e
inmediatamente proporciona a tu aplicación poderosas
características como capacidades de scripting, DSLs,
metaprogramación en runtime y compile-time y programación
funcional.
– Web de Groovy
Groovy
2.
¿Y por qué no Java?
➢ Java es sólido
➢ Conocido por muchos desarrolladores
➢ Muy extendido
➢ Es rápido
Pero...
➢ Java es verboso
➢ Puede ser incómodo en algunos casos
➢ No es dinámico
¿Y por qué no Java?
3.
Haciendo Java Groovy
public class Saludador {
private String saludo;
public void diHolaA(String... nombres) {
String mensajeSaludo = prepararMensajeSaludo(nombres);
System.out.println(mensajeSaludo);
}
public String getSaludo() {
return saludo;
}
public void setSaludo(String saludo) {
this.saludo = saludo;
}
private String prepararMensajeSaludo(String... nombres) {
String delimitador = "";
StringBuilder sb = new StringBuilder();
for (String nombre : nombres) {
sb.append(delimitador).append(nombre);
delimitador = ", ";
}
return this.saludo + " " + sb.toString() + "!";
}
public static void main(String[] args) {
final Saludador saludador = new Saludador();
saludador.setSaludo("Hola");
saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard");
}
}
Saludador.java
Renombrar
public class Saludador {
private String saludo;
public void diHolaA(String... nombres) {
String mensajeSaludo = prepararMensajeSaludo(nombres);
System.out.println(mensajeSaludo);
}
public String getSaludo() {
return saludo;
}
public void setSaludo(String saludo) {
this.saludo = saludo;
}
private String prepararMensajeSaludo(String... nombres) {
String delimitador = "";
StringBuilder sb = new StringBuilder();
for (String nombre : nombres) {
sb.append(delimitador).append(nombre);
delimitador = ", ";
}
return this.saludo + " " + sb.toString() + "!";
}
public static void main(String[] args) {
final Saludador saludador = new Saludador();
saludador.setSaludo("Hola");
saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard");
}
}
Saludador.groovy
public class Saludador {
private String saludo;
public void diHolaA(String... nombres) {
String mensajeSaludo = prepararMensajeSaludo(nombres);
System.out.println(mensajeSaludo);
}
public String getSaludo() {
return saludo;
}
public void setSaludo(String saludo) {
this.saludo = saludo;
}
private String prepararMensajeSaludo(String... nombres) {
String delimitador = "";
StringBuilder sb = new StringBuilder();
for (String nombre : nombres) {
sb.append(delimitador).append(nombre);
delimitador = ", ";
}
return this.saludo + " " + sb.toString() + "!";
}
public static void main(String[] args) {
final Saludador saludador = new Saludador();
saludador.setSaludo("Hola");
saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard");
}
}
Groovy
public class Saludador {
private String saludo
public void diHolaA(String... nombres) {
String mensajeSaludo = prepararMensajeSaludo(nombres)
System.out.println(mensajeSaludo)
}
public String getSaludo() {
return saludo
}
public void setSaludo(String saludo) {
this.saludo = saludo
}
private String prepararMensajeSaludo(String... nombres) {
String delimitador = ""
StringBuilder sb = new StringBuilder()
for (String nombre : nombres) {
sb.append(delimitador).append(nombre)
delimitador = ", "
}
return this.saludo + " " + sb.toString() + "!"
}
public static void main(String[] args) {
final Saludador saludador = new Saludador()
saludador.setSaludo("Hola")
saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard")
}
}
opcional
opcional
Groovy
class Saludador {
private String saludo
void diHolaA(String... nombres) {
String mensajeSaludo = prepararMensajeSaludo(nombres)
System.out.println(mensajeSaludo)
}
String getSaludo() {
return saludo
}
void setSaludo(String saludo) {
this.saludo = saludo
}
private String prepararMensajeSaludo(String... nombres) {
String delimitador = ""
StringBuilder sb = new StringBuilder()
for (String nombre : nombres) {
sb.append(delimitador).append(nombre)
delimitador = ", "
}
return this.saludo + " " + sb.toString() + "!"
}
static void main(String[] args) {
final Saludador saludador = new Saludador()
saludador.setSaludo("Hola")
saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard")
}
}
getter y setter
verbosos
Groovy
class Saludador {
String saludo
void diHolaA(String... nombres) {
String mensajeSaludo = prepararMensajeSaludo(nombres)
System.out.println(mensajeSaludo)
}
private String prepararMensajeSaludo(String... nombres) {
String delimitador = ""
StringBuilder sb = new StringBuilder()
for (String nombre : nombres) {
sb.append(delimitador).append(nombre)
delimitador = ", "
}
return this.saludo + " " + sb.toString() + "!"
}
static void main(String[] args) {
final Saludador saludador = new Saludador()
saludador.setSaludo("Hola")
saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard")
}
}
Acceso como
propiedad
Groovy
class Saludador {
String saludo
void diHolaA(String... nombres) {
String mensajeSaludo = prepararMensajeSaludo(nombres)
System.out.println(mensajeSaludo)
}
private String prepararMensajeSaludo(String... nombres) {
String delimitador = ""
StringBuilder sb = new StringBuilder()
for (String nombre : nombres) {
sb.append(delimitador).append(nombre)
delimitador = ", "
}
return this.saludo + " " + sb.toString() + "!"
}
static void main(String[] args) {
final Saludador saludador = new Saludador()
saludador.saludo = "Hola"
saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard")
}
}
opcional
Groovy
class Saludador {
String saludo
void diHolaA(String... nombres) {
String mensajeSaludo = prepararMensajeSaludo(nombres)
System.out.println(mensajeSaludo)
}
private String prepararMensajeSaludo(String... nombres) {
String delimitador = ""
StringBuilder sb = new StringBuilder()
for (String nombre : nombres) {
sb.append(delimitador).append(nombre)
delimitador = ", "
}
this.saludo + " " + sb.toString() + "!"
}
static void main(String[] args) {
final Saludador saludador = new Saludador()
saludador.saludo = "Hola"
saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard")
}
}
atajo
Groovy
class Saludador {
String saludo
void diHolaA(String... nombres) {
String mensajeSaludo = prepararMensajeSaludo(nombres)
println(mensajeSaludo)
}
private String prepararMensajeSaludo(String... nombres) {
String delimitador = ""
StringBuilder sb = new StringBuilder()
for (String nombre : nombres) {
sb.append(delimitador).append(nombre)
delimitador = ", "
}
this.saludo + " " + sb.toString() + "!"
}
static void main(String[] args) {
final Saludador saludador = new Saludador()
saludador.saludo = "Hola"
saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard")
}
}
API de
colecciones
Groovy
class Saludador {
String saludo
void diHolaA(String... nombres) {
String mensajeSaludo = prepararMensajeSaludo(nombres)
println(mensajeSaludo)
}
private String prepararMensajeSaludo(String... nombres) {
String nombreUnidos = nombres.join(', ')
this.saludo + " " + nombresUnidos + "!"
}
static void main(String[] args) {
final Saludador saludador = new Saludador()
saludador.saludo = "Hola"
saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard")
}
}
interpolación
de String (GString)
Groovy
class Saludador {
String saludo
void diHolaA(String... nombres) {
String mensajeSaludo = prepararMensajeSaludo(nombres)
println(mensajeSaludo)
}
private String prepararMensajeSaludo(String... nombres) {
String nombreUnidos = nombres.join(', ')
"${this.saludo} $nombreUnidos!"
}
static void main(String[] args) {
final Saludador saludador = new Saludador()
saludador.saludo = "Hola"
saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard")
}
}
refactor
Groovy
class Saludador {
String saludo
void diHolaA(String... nombres) {
String mensajeSaludo = prepararMensajeSaludo(nombres)
println(mensajeSaludo)
}
private String prepararMensajeSaludo(String... nombres) {
"$saludo ${nombres.join(', ')}!"
}
static void main(String[] args) {
final Saludador saludador = new Saludador()
saludador.saludo = "Hola"
saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard")
}
}
tipado
opcional
Groovy
class Saludador {
String saludo
void diHolaA(String... nombres) {
def mensajeSaludo = prepararMensajeSaludo(nombres)
println(mensajeSaludo)
}
private String prepararMensajeSaludo(String... nombres) {
"$saludo ${nombres.join(', ')}!"
}
static void main(String[] args) {
def saludador = new Saludador()
saludador.saludo = "Hola"
saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard")
}
}
named
constructor
Groovy
class Saludador {
String saludo
void diHolaA(String... nombres) {
def mensajeSaludo = prepararMensajeSaludo(nombres)
println(mensajeSaludo)
}
private String prepararMensajeSaludo(String... nombres) {
"$saludo ${nombres.join(', ')}!"
}
static void main(String[] args) {
def saludador = new Saludador(saludo: 'Hola')
saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard")
}
}
paréntesis
opcionales
paréntesis
opcionales
Groovy
class Saludador {
String saludo
void diHolaA(String... nombres) {
def mensajeSaludo = prepararMensajeSaludo(nombres)
println mensajeSaludo
}
private String prepararMensajeSaludo(String... nombres) {
"$saludo ${nombres.join(', ')}!"
}
static void main(String[] args) {
def saludador = new Saludador(saludo: 'Hola')
saludador.diHolaA "Sheldon", "Leonard", "Raj", "Howard"
}
}
main como
script
Groovy
class Saludador {
String saludo
void diHolaA(String... nombres) {
def mensajeSaludo = prepararMensajeSaludo(nombres)
println mensajeSaludo
}
private String prepararMensajeSaludo(String... nombres) {
"$saludo ${nombres.join(', ')}!"
}
}
saludador = new Saludador(saludo: 'Hola')
saludador.diHolaA "Sheldon", "Leonard", "Raj", "Howard"
refactor
Groovy
class Saludador {
String saludo
void diHolaA(String... nombres) {
println "$saludo ${nombres.join(', ')}!"
}
}
saludador = new Saludador(saludo: 'Hola')
saludador.diHolaA "Sheldon", "Leonard", "Raj", "Howard"
Limpiemos
los espacios
Groovy
class Saludador {
String saludo
void diHolaA(String... nombres) {
println "$saludo ${nombres.join(', ')}!"
}
}
saludador = new Saludador(saludo: 'Hola')
saludador.diHolaA "Sheldon", "Leonard", "Raj", "Howard"
Groovy: Versión final
class Saludador {
String saludo
void diHolaA(String... nombres) {
println "$saludo ${nombres.join(', ')}!"
}
}
saludador = new Saludador(saludo: 'Hola')
saludador.diHolaA "Sheldon", "Leonard", "Raj", "Howard"
Groovy: Versión final
Java 32 líneas 900 caracteres
Groovy 10 líneas 231 caracteres
Diferencia 68% 74%
Groovy: ¡Hora de Aventuras!
4.
Groovy
➢ Dinámico
➢ Compilación estática opcional
➢ Todo es un objeto
➢ Sobrecarga de operadores
➢ + es .plus()
➢ * es .multiply()
➢ Sintaxis nativa de listas, mapas y rangos
➢ Métodos y clases public por defecto
➢ Las excepciones son unchecked
➢ http://groovy-lang.org/differences.html
Diferencias entre Java y Groovy
Getters y setters
public class Persona {
private String nombre;
private int edad;
String getNombre() {
return nombre;
}
void setNombre(String nombre) {
this.nombre = nombre;
}
int getEdad() {
return edad;
}
void setEdad(int edad) {
this.edad = edad;
}
}
Getters y setters
public class Persona {
private String nombre;
private int edad;
String getNombre() {
return nombre;
}
void setNombre(String nombre) {
this.nombre = nombre;
}
int getEdad() {
return edad;
}
void setEdad(int edad) {
this.edad = edad;
}
}
class Persona {
String nombre
int edad
}
Named constructors
class Persona {
String nombre
int edad
}
def p = new Persona(nombre: 'Iván', edad: 36)
assert p.nombre == 'Iván'
p.edad = 37
assert p.edad == 37
Constructor Builder
import groovy.transform.builder.Builder
@Builder
class Persona {
String nombre
int edad
}
Persona.builder()
.nombre('Iván')
.edad(36)
.build()
Números que...
System.out.println(2.00 - 1.1);
// 0.8999999999999999
Números que...
System.out.println(2.00 - 1.1);
// 0.8999999999999999
Números que...
System.out.println(3 / 2);
// 1
Números que...
System.out.println(3 / 2);
// 1
¡BigDecimal por defecto!
assert 2.0 - 1.1 == 0.9
assert 3 / 2 == 1.5
Equals y ==
estado != null &&
estado.equals(Estado.COMPLETADO);
Equals y ==
estado == Estado.COMPLETADO
estado != null &&
estado.equals(Estado.COMPLETADO);
Strings y GString
def nombre = 'Iván'
def edad = 36
println "¡Hola ${nombre}, tienes ${edad} años!"
def query = """
insert into people
(firstName, age)
values (${nombre}, ${edad})
"""
new Sql(datasource).execute query
Strings y GString
def nombre = 'Iván'
def edad = 36
println "¡Hola ${nombre}, tienes ${edad} años!"
def query = """
insert into people
(firstName, age)
values (${nombre}, ${edad})
"""
new Sql(datasource).execute query
Listas
def list = ['a', 'b', 'c']
list << 'd' // list.add(“d”)
assert list.contains('d')
assert list.collect { it.toUpperCase() } == ['A', 'B', 'C', 'D']
assert list.findAll { it.startsWith 'a' }.size() == 1
Listas
def list = ['a', 'b', 'c']
list << 'd' // list.add(“d”)
assert list.contains('d')
assert list.collect { it.toUpperCase() } == ['A', 'B', 'C', 'D']
assert list.findAll { it.startsWith 'a' }.size() == 1
Listas
def list = ['a', 'b', 'c']
list << 'd' // list.add(“d”)
assert list.contains('d')
assert list.collect { it.toUpperCase() } == ['A', 'B', 'C', 'D']
assert list.findAll { it.startsWith 'a' }.size() == 1
Mapas
def map = [nombre: 'Iván', edad: 36]
assert map.nombre == 'Iván'
map.hijas = ['Judith', 'Adriana']
assert map['hijas'].contains('Adriana')
Mapas
def map = [nombre: 'Iván', edad: 36]
assert map.nombre == 'Iván'
map.hijas = ['Judith', 'Adriana']
assert map['hijas'].contains('Adriana')
def map = [nombre: 'Iván', edad: 36]
assert map.nombre == 'Iván'
map.hijas = ['Judith', 'Adriana']
assert map['hijas'].contains('Adriana')
Rangos
def rango = 'a'..'z'
assert rango.contains('i')
assert rango.contains('z')
def exclusivo = 1..<10
assert !exclusivo.contains(10)
def inverso = 10..1
assert inverso[0] == 10
assert inverso[-1] == 1
Rangos
def rango = 'a'..'z'
assert rango.contains('i')
assert rango.contains('z')
def exclusivo = 1..<10
assert !exclusivo.contains(10)
def inverso = 10..1
assert inverso[0] == 10
assert inverso[-1] == 1
Rangos
def rango = 'a'..'z'
assert rango.contains('i')
assert rango.contains('z')
def exclusivo = 1..<10
assert !exclusivo.contains(10)
def inverso = 10..1
assert inverso[0] == 10
assert inverso[-1] == 1
Groovy truth
assert !( null )
assert !( "" )
assert !( '' )
assert !( [] )
assert !( [:] )
assert !( 0 )
Groovy truth
false
assert !( null )
assert !( "" )
assert !( '' )
assert !( [] )
assert !( [:] )
assert !( 0 )
Groovy truth
assert new Object()
assert "string"
assert 'string'
assert [1, 2]
assert [a: 1]
assert 1
false
assert !( null )
assert !( "" )
assert !( '' )
assert !( [] )
assert !( [:] )
assert !( 0 )
Groovy truth
assert new Object()
assert "string"
assert 'string'
assert [1, 2]
assert [a: 1]
assert 1
false
true
assert !( null )
assert !( "" )
assert !( '' )
assert !( [] )
assert !( [:] )
assert !( 0 )
Power asserts
assert (2 + 7) * 5 != (2 * 5) + (7 * 5)
(2 + 7) * 5 != (2 * 5) + (7 * 5)
| | | | | |
9 45 false 10 45 35
Power asserts
assert (2 + 7) * 5 != (2 * 5) + (7 * 5)
(2 + 7) * 5 != (2 * 5) + (7 * 5)
| | | | | |
9 45 false 10 45 35
Power asserts
def info = [
nombre: 'Iván', edad: 36,
hijas: [
[nombre: 'Judith', edad: 8], [nombre: 'Adriana', edad: 5]
]
]
assert info.hijas.nombre.first() == 'Adriana'
info.hijas.nombre.first() == 'Adriana'
| | | | |
| | | Judith false
| | | 6 differences (14% similarity)
| | | (Ju)d(-)i(th-)
| | | (A-)d(r)i(ana)
| | [Judith, Adriana]
| [[nombre:Judith, edad:8], [nombre:Adriana, edad:5]]
[nombre:Iván, edad:36, hijas:[[nombre:Judith, edad:8],
[nombre:Adriana, edad:5]]]
Power asserts
def info = [
nombre: 'Iván', edad: 36,
hijas: [
[nombre: 'Judith', edad: 8], [nombre: 'Adriana', edad: 5]
]
]
assert info.hijas.nombre.first() == 'Adriana'
info.hijas.nombre.first() == 'Adriana'
| | | | |
| | | Judith false
| | | 6 differences (14% similarity)
| | | (Ju)d(-)i(th-)
| | | (A-)d(r)i(ana)
| | [Judith, Adriana]
| [[nombre:Judith, edad:8], [nombre:Adriana, edad:5]]
[nombre:Iván, edad:36, hijas:[[nombre:Judith, edad:8],
[nombre:Adriana, edad:5]]]
Power asserts
def info = [
nombre: 'Iván', edad: 36,
hijas: [
[nombre: 'Judith', edad: 8], [nombre: 'Adriana', edad: 5]
]
]
assert info.hijas.nombre.first() == 'Adriana'
info.hijas.nombre.first() == 'Adriana'
| | | | |
| | | Judith false
| | | 6 differences (14% similarity)
| | | (Ju)d(-)i(th-)
| | | (A-)d(r)i(ana)
| | [Judith, Adriana]
| [[nombre:Judith, edad:8], [nombre:Adriana, edad:5]]
[nombre:Iván, edad:36, hijas:[[nombre:Judith, edad:8],
[nombre:Adriana, edad:5]]]
Power asserts
def info = [
nombre: 'Iván', edad: 36,
hijas: [
[nombre: 'Judith', edad: 8], [nombre: 'Adriana', edad: 5]
]
]
assert info.hijas.nombre.first() == 'Adriana'
info.hijas.nombre.first() == 'Adriana'
| | | | |
| | | Judith false
| | | 6 differences (14% similarity)
| | | (Ju)d(-)i(th-)
| | | (A-)d(r)i(ana)
| | [Judith, Adriana]
| [[nombre:Judith, edad:8], [nombre:Adriana, edad:5]]
[nombre:Iván, edad:36, hijas:[[nombre:Judith, edad:8],
[nombre:Adriana, edad:5]]]
Power asserts
def info = [
nombre: 'Iván', edad: 36,
hijas: [
[nombre: 'Judith', edad: 8], [nombre: 'Adriana', edad: 5]
]
]
assert info.hijas.nombre.first() == 'Adriana'
info.hijas.nombre.first() == 'Adriana'
| | | | |
| | | Judith false
| | | 6 differences (14% similarity)
| | | (Ju)d(-)i(th-)
| | | (A-)d(r)i(ana)
| | [Judith, Adriana]
| [[nombre:Judith, edad:8], [nombre:Adriana, edad:5]]
[nombre:Iván, edad:36, hijas:[[nombre:Judith, edad:8],
[nombre:Adriana, edad:5]]]
def info = [
nombre: 'Iván', edad: 36,
hijas: [
[nombre: 'Judith', edad: 8], [nombre: 'Adriana', edad: 5]
]
]
assert info.hijas.nombre.first() == 'Adriana'
info.hijas.nombre.first() == 'Adriana'
| | | | |
| | | Judith false
| | | 6 differences (14% similarity)
| | | (Ju)d(-)i(th-)
| | | (A-)d(r)i(ana)
| | [Judith, Adriana]
| [[nombre:Judith, edad:8], [nombre:Adriana, edad:5]]
[nombre:Iván, edad:36, hijas:[[nombre:Judith, edad:8],
[nombre:Adriana, edad:5]]]
Power asserts
Elvis
List resultado =
(nombres != null && nombres.size() > 0) ?
nombres : Collections.emptyList();
Elvis
List resultado =
(nombres != null && nombres.size() > 0) ?
nombres : Collections.emptyList();
def resultado = nombres ? nombres : []
Elvis
List resultado =
(nombres != null && nombres.size() > 0) ?
nombres : Collections.emptyList();
def resultado = nombres ? nombres : []
def resultado = nombres ?: []
Safe navigation
if (order != null) {
if (order.getCustomer() != null) {
if (order.getCustomer().getAddress() != null) {
System.out.println(order.getCustomer().getAddress());
}
}
}
Safe navigation
if (order != null) {
if (order.getCustomer() != null) {
if (order.getCustomer().getAddress() != null) {
System.out.println(order.getCustomer().getAddress());
}
}
}
println order?.customer?.address
Closures
def multiplicador = { a, b -> a * b }
assert multiplicador(2, 3) == 6
assert multiplicador.call(2, 3) == 6
assert multiplicador('=', 8) == '========'
def sumador = { ... numbers -> numbers.sum() }
assert sumador(1, 2, 3) == 6
assert sumador('a', 'b', 'c') == 'abc'
def multiplicador = { int a, int b -> a * b }
def multiplicador = { a, b -> a * b }
assert multiplicador(2, 3) == 6
assert multiplicador.call(2, 3) == 6
assert multiplicador('=', 8) == '========'
def sumador = { ... numbers -> numbers.sum() }
assert sumador(1, 2, 3) == 6
assert sumador('a', 'b', 'c') == 'abc'
def multiplicador = { int a, int b -> a * b }
Closures
def multiplicador = { a, b -> a * b }
assert multiplicador(2, 3) == 6
assert multiplicador.call(2, 3) == 6
assert multiplicador('=', 8) == '========'
def sumador = { ... numbers -> numbers.sum() }
assert sumador(1, 2, 3) == 6
assert sumador('a', 'b', 'c') == 'abc'
def multiplicador = { int a, int b -> a * b }
Closures
Closures: Valores por defecto
def multiplicador = { int a, int b = 10 -> a * b }
assert multiplicador(2, 3) == 6
assert multiplicador(2) == 20
Closures: Métodos como función
def logBase10 = Math.&log10
assert logBase10(10) == 1
Closures: map, filter, reduce
def personas = [
new Persona('Iván', 36),
new Persona('Judith', 8),
new Persona('Adriana', 5)
]
def nombres = personas.findAll { it.edad < 18 }
.collect { it.nombre.toUpperCase() }
.sort()
.join(', ')
assert nombres == 'ADRIANA, JUDITH'
Closures: map, filter, reduce
def personas = [
new Persona('Iván', 36),
new Persona('Judith', 8),
new Persona('Adriana', 5)
]
def nombres = personas.findAll { it.edad < 18 }
.collect { it.nombre.toUpperCase() }
.sort()
.join(', ')
assert nombres == 'ADRIANA, JUDITH'
Closures: map, filter, reduce
def personas = [
new Persona('Iván', 36),
new Persona('Judith', 8),
new Persona('Adriana', 5)
]
def nombres = personas.findAll { it.edad < 18 }
.collect { it.nombre.toUpperCase() }
.sort()
.join(', ')
assert nombres == 'ADRIANA, JUDITH'
Groovy Closures y Java 8 Lambdas
import static java.util.Arrays.asList;
public class JavaLambdas {
public static void main(String[] args) {
asList(1, 2, 3).stream()
.map(i -> i * 2)
.filter(i -> i > 3)
.findFirst()
.orElseThrow(IllegalArgumentException::new);
}
}
Groovy Closures y Java 8 Lambdas
import static java.util.Arrays.asList;
public class JavaLambdas {
public static void main(String[] args) {
asList(1, 2, 3).stream()
.map(i -> i * 2)
.filter(i -> i > 3)
.findFirst()
.orElseThrow(IllegalArgumentException::new);
}
}
[1, 2, 3].stream()
.map { i -> i * 2 }
.filter { i -> i > 3 }
.findFirst()
.orElseThrow(IllegalArgumentException.&newInstance)
Json builder
{
"speaker": {
"firstName": "Iván",
"lastName": "López",
"address": {
"city": "Madrid",
"country": "España",
"zip": 12345
},
"conferences": [
"T3chFest",
"Codemotion",
"Greach"
]
}
}
import groovy.json.JsonBuilder
def builder = new JsonBuilder()
builder.
speaker {
firstName 'Iván'
lastName 'López'
address(
city: 'Madrid',
country: 'España',
zip: 12345,
)
conferences(
'T3chFest',
'Codemotion',
'Greach'
)
}
println builder.toPrettyString()
Json builder
{
"speaker": {
"firstName": "Iván",
"lastName": "López",
"address": {
"city": "Madrid",
"country": "España",
"zip": 12345
},
"conferences": [
"T3chFest",
"Codemotion",
"Greach"
]
}
}
import groovy.json.JsonBuilder
def builder = new JsonBuilder()
builder.
speaker {
firstName 'Iván'
lastName 'López'
address(
city: 'Madrid',
country: 'España',
zip: 12345,
)
conferences(
'T3chFest',
'Codemotion',
'Greach'
)
}
println builder.toPrettyString()
Parsear XML y Json en Java
Json parser
wind: {
speed: 2.1,
deg: 350
},
clouds: {
all: 75
},
dt: 1454061483,
sys: {
type: 1,
id: 5488,
message: 0.0046,
country: "ES",
sunrise: 1454052430,
sunset: 1454088574
},
id: 3118594,
name: "Leganes",
cod: 200
}
http://api.openweathermap.org/data/2.5/weather?
units=metric&q=Leganes&appid=...
{
coord: {
lon: -3.76,
lat: 40.33
},
weather: [
{
id: 300,
main: "Drizzle",
description: "few clouds",
icon: "09d"
}
],
base: "cmc stations",
main: {
temp: 8.21,
pressure: 1032,
humidity: 87,
temp_min: 8,
temp_max: 8.6
},
Json parser
http://api.openweathermap.org/data/2.5/weather?
units=metric&q=Leganes&appid=...
wind: {
speed: 2.1,
deg: 350
},
clouds: {
all: 75
},
dt: 1454061483,
sys: {
type: 1,
id: 5488,
message: 0.0046,
country: "ES",
sunrise: 1454052430,
sunset: 1454088574
},
id: 3118594,
name: "Leganes",
cod: 200
}
{
coord: {
lon: -3.76,
lat: 40.33
},
weather: [
{
id: 300,
main: "Drizzle",
description: "few clouds",
icon: "09d"
}
],
base: "cmc stations",
main: {
temp: 8.21,
pressure: 1032,
humidity: 87,
temp_min: 8,
temp_max: 8.6
},
Json parser
import groovy.json.JsonSlurper
def url = "http://api.openweathermap.org/data/2.5/weather?
units=metric&q=Leganes&appid=...".toURL()
def response = new JsonSlurper().parse(url)
String weather = response.weather.collect { it.description }.join(', ')
String country = response.sys.country
String temp = response.main.temp
String city = response.name
println "Tiempo en ${city} (${country}): ${weather}. Temp: ${temp} ºC"
// Tiempo en Leganes (ES): few clouds. Temp: 8.84 ºC
{
weather: [
{
description: "few clouds",
}
],
main: {
temp: 8.21
},
sys: {
country: "ES",
},
name: "Leganes",
}
Json parser
import groovy.json.JsonSlurper
def url = "http://api.openweathermap.org/data/2.5/weather?
units=metric&q=Leganes&appid=...".toURL()
def response = new JsonSlurper().parse(url)
String weather = response.weather.collect { it.description }.join(', ')
String country = response.sys.country
String temp = response.main.temp
String city = response.name
println "Tiempo en ${city} (${country}): ${weather}. Temp: ${temp} ºC"
// Tiempo en Leganes (ES): few clouds. Temp: 8.84 ºC
{
weather: [
{
description: "few clouds",
}
],
main: {
temp: 8.21
},
sys: {
country: "ES",
},
name: "Leganes",
}
Json parser
import groovy.json.JsonSlurper
def url = "http://api.openweathermap.org/data/2.5/weather?
units=metric&q=Leganes&appid=...".toURL()
def response = new JsonSlurper().parse(url)
String weather = response.weather.collect { it.description }.join(', ')
String country = response.sys.country
String temp = response.main.temp
String city = response.name
println "Tiempo en ${city} (${country}): ${weather}. Temp: ${temp} ºC"
// Tiempo en Leganes (ES): few clouds. Temp: 8.84 ºC
{
weather: [
{
description: "few clouds",
}
],
main: {
temp: 8.21
},
sys: {
country: "ES",
},
name: "Leganes",
}
Json parser
import groovy.json.JsonSlurper
def url = "http://api.openweathermap.org/data/2.5/weather?
units=metric&q=Leganes&appid=...".toURL()
def response = new JsonSlurper().parse(url)
String weather = response.weather.collect { it.description }.join(', ')
String country = response.sys.country
String temp = response.main.temp
String city = response.name
println "Tiempo en ${city} (${country}): ${weather}. Temp: ${temp} ºC"
// Tiempo en Leganes (ES): few clouds. Temp: 8.21 ºC
{
weather: [
{
description: "few clouds",
}
],
main: {
temp: 8.21
},
sys: {
country: "ES",
},
name: "Leganes",
}
Lectura de fichero de texto
static String readFile(File file) throws IOException {
byte[] bytes = Files.readAllBytes(file.toPath());
return new String(bytes, "UTF-8");
}
public static void main(String[] args) {
File file = new File("foo.txt");
try {
String content = readFile(file);
System.out.println(content);
} catch (IOException e) {
e.printStackTrace();
}
}
Lectura de fichero de texto
static String readFile(File file) throws IOException {
byte[] bytes = Files.readAllBytes(file.toPath());
return new String(bytes, "UTF-8");
}
public static void main(String[] args) {
File file = new File("foo.txt");
try {
String content = readFile(file);
System.out.println(content);
} catch (IOException e) {
e.printStackTrace();
}
}
String content = new File('foo.txt').text
Lectura de fichero de texto
static String readFile(File file) throws IOException {
byte[] bytes = Files.readAllBytes(file.toPath());
return new String(bytes, "UTF-8");
}
public static void main(String[] args) {
File file = new File("foo.txt");
try {
String content = readFile(file);
System.out.println(content);
} catch (IOException e) {
e.printStackTrace();
}
}
String content = new File('foo.txt').text
Lectura de una URL
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class GetURLContent {
public static void main(String[] args) {
try {
URL url = new URL("http://www.google.com");
URLConnection conn = url.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
while ((inputLine = br.readLine()) != null) {
System.out.println(inputLine);
}
br.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Lectura de una URL
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class GetURLContent {
public static void main(String[] args) {
try {
URL url = new URL("http://www.google.com");
URLConnection conn = url.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
while ((inputLine = br.readLine()) != null) {
System.out.println(inputLine);
}
br.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
println 'http://www.google.com'.toURL().text
Lectura de una URL
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class GetURLContent {
public static void main(String[] args) {
try {
URL url = new URL("http://www.google.com");
URLConnection conn = url.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
while ((inputLine = br.readLine()) != null) {
System.out.println(inputLine);
}
br.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
println 'http://www.google.com'.toURL().text
➢ Groovy JDK
➢ Amplía tipos
➢ Añade métodos
➢ http://www.groovy-lang.org/gdk.html
GDK
5.
¡Quiero más!
DSLs: Domain Specific Languages
def mailer = new Mailer()
mailer.setTo('admin@example.com', 'user@example.com')
mailer.setSubject('Urgente!')
mailer.setBody('Bla, bla, bla')
mailer.setHeaders(spam: 'no', important: true)
DSLs: Domain Specific Languages
def mailer = new Mailer()
mailer.setTo('admin@example.com', 'user@example.com')
mailer.setSubject('Urgente!')
mailer.setBody('Bla, bla, bla')
mailer.setHeaders(spam: 'no', important: true)
def mailer = new Mailer()
.setTo('admin@example.com', 'user@example.com')
.setSubject('Urgente!')
.setBody('Bla, bla, bla')
.setHeaders(spam: 'no', important: true)
DSLs: Domain Specific Languages
mail {
to 'admin@example.com', 'user@example.com'
subject 'Urgente!'
body 'Bla, bla, bla'
headers spam: 'no', important: true
}
class MailComposer {
void to(String... addresses) { println "to: $addresses"}
void subject(String subject) { println "subject: $subject" }
void body(String body) { println "body: $body" }
void headers(Map headers) { println "headers: $headers" }
}
void mail(@DelegatesTo(MailComposer) Closure composer) {
// Igual que:
// new MailComposer().with(composer)
Closure cl = composer.clone()
cl.delegate = new MailComposer()
cl.resolveStrategy = Closure.DELEGATE_FIRST
cl()
}
DSLs: Domain Specific Languages
mail {
to 'admin@example.com', 'user@example.com'
subject 'Urgente!'
body 'Bla, bla, bla'
headers spam: 'no', important: true
}
class MailComposer {
void to(String... addresses) { println "to: $addresses"}
void subject(String subject) { println "subject: $subject" }
void body(String body) { println "body: $body" }
void headers(Map headers) { println "headers: $headers" }
}
void mail(@DelegatesTo(MailComposer) Closure composer) {
// Igual que:
// new MailComposer().with(composer)
Closure cl = composer.clone()
cl.delegate = new MailComposer()
cl.resolveStrategy = Closure.DELEGATE_FIRST
cl()
}
DSLs: Domain Specific Languages
mail {
to 'admin@example.com', 'user@example.com'
subject 'Urgente!'
body 'Bla, bla, bla'
headers spam: 'no', important: true
}
class MailComposer {
void to(String... addresses) { println "to: $addresses"}
void subject(String subject) { println "subject: $subject" }
void body(String body) { println "body: $body" }
void headers(Map headers) { println "headers: $headers" }
}
void mail(@DelegatesTo(MailComposer) Closure composer) {
// Igual que:
// new MailComposer().with(composer)
Closure cl = composer.clone()
cl.delegate = new MailComposer()
cl.resolveStrategy = Closure.DELEGATE_FIRST
cl()
}
➢ +50 trasformación out-of-the-box
➢ @ToString, @EqualsAndHashCode, @InheritConstructors,
@Sortable, @Delegate, @Immutable, @CompileStatic,...
Transformaciones AST
@EqualsAndHashCode
public class User extends java.lang.Object {
private java.lang.String name
private java.lang.Integer age
public int hashCode() {
java.lang.Object _result = org.codehaus.groovy.util.HashCodeHelper.initHash()
if (!(this.getName().is(this))) {
_result = org.codehaus.groovy.util.HashCodeHelper.updateHash(_result, this.getName())
}
if (!(this.getAge().is(this))) {
_result = org.codehaus.groovy.util.HashCodeHelper.updateHash(_result, this.getAge())
}
return _result
}
public boolean canEqual(java.lang.Object other) {
return other instanceof User
}
public boolean equals(java.lang.Object other) {
if ( other == null) {
return false
}
if (this.is(other)) {
return true
}
if (!( other instanceof User)) {
return false
}
User otherTyped = (( other ) as User)
if (!(otherTyped.canEqual( this ))) {
return false
}
if (!(this.getName() == otherTyped.getName())) {
return false
}
if (!(this.getAge() == otherTyped.getAge())) {
return false
}
return true
}
}
@EqualsAndHashCode
@groovy.transform.EqualsAndHashCode
class User {
String name
Integer age
}
¡Gracias!
¡Gracias!
¿Preguntas?
@ilopmar
lopez.ivan@gmail.com
https://github.com/ilopmar
Iván López
http://bit.ly/t3chfest-groovy

More Related Content

What's hot

Codemotion Madrid 2016 - De Java a Groovy: ¡Hora de Aventuras!
Codemotion Madrid 2016 - De Java a Groovy: ¡Hora de Aventuras!Codemotion Madrid 2016 - De Java a Groovy: ¡Hora de Aventuras!
Codemotion Madrid 2016 - De Java a Groovy: ¡Hora de Aventuras!Iván López Martín
 
Jobsket.com, Grails en un proyecto real
Jobsket.com, Grails en un proyecto realJobsket.com, Grails en un proyecto real
Jobsket.com, Grails en un proyecto realJobsket
 
Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!
Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!
Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!Iván López Martín
 
WebRTC y Kurento en el T3cgFest 2015
WebRTC y Kurento en el T3cgFest 2015WebRTC y Kurento en el T3cgFest 2015
WebRTC y Kurento en el T3cgFest 2015Micael Gallego
 
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesDesarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesJobsket
 
Jobsket Spring 2GX Madrid
Jobsket Spring 2GX MadridJobsket Spring 2GX Madrid
Jobsket Spring 2GX MadridJobsket
 
Mejorando la productividad en proyectos java EE con CI y CD - OTN 2015
Mejorando la productividad en proyectos java EE con  CI y CD - OTN 2015 Mejorando la productividad en proyectos java EE con  CI y CD - OTN 2015
Mejorando la productividad en proyectos java EE con CI y CD - OTN 2015 César Hernández
 
Java mission control para monitoreo, administración y profilig de aplicacione...
Java mission control para monitoreo, administración y profilig de aplicacione...Java mission control para monitoreo, administración y profilig de aplicacione...
Java mission control para monitoreo, administración y profilig de aplicacione...César Hernández
 
WebRTC en tu web con OpenVidu
WebRTC en tu web con OpenViduWebRTC en tu web con OpenVidu
WebRTC en tu web con OpenViduMicael Gallego
 
OpenVidu Commitconf 2018
OpenVidu Commitconf 2018 OpenVidu Commitconf 2018
OpenVidu Commitconf 2018 Micael Gallego
 
GraalVM - MálagaJUG 2018-11-29
GraalVM - MálagaJUG 2018-11-29GraalVM - MálagaJUG 2018-11-29
GraalVM - MálagaJUG 2018-11-29Jorge Hidalgo
 
Ecuador jug 2017 -incrementando la productividad de proyectos java ee con c...
Ecuador jug   2017 -incrementando la productividad de proyectos java ee con c...Ecuador jug   2017 -incrementando la productividad de proyectos java ee con c...
Ecuador jug 2017 -incrementando la productividad de proyectos java ee con c...César Hernández
 
Grails and Continuous delivery
Grails and Continuous deliveryGrails and Continuous delivery
Grails and Continuous deliveryInfo ArtdeCode
 
PHP for Android: scripting PHP en Android
PHP for Android: scripting PHP en AndroidPHP for Android: scripting PHP en Android
PHP for Android: scripting PHP en AndroidIrontec
 

What's hot (20)

Codemotion Madrid 2016 - De Java a Groovy: ¡Hora de Aventuras!
Codemotion Madrid 2016 - De Java a Groovy: ¡Hora de Aventuras!Codemotion Madrid 2016 - De Java a Groovy: ¡Hora de Aventuras!
Codemotion Madrid 2016 - De Java a Groovy: ¡Hora de Aventuras!
 
Jobsket.com, Grails en un proyecto real
Jobsket.com, Grails en un proyecto realJobsket.com, Grails en un proyecto real
Jobsket.com, Grails en un proyecto real
 
Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!
Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!
Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!
 
WebRTC y Kurento en el T3cgFest 2015
WebRTC y Kurento en el T3cgFest 2015WebRTC y Kurento en el T3cgFest 2015
WebRTC y Kurento en el T3cgFest 2015
 
Creación de Plataformas
Creación de PlataformasCreación de Plataformas
Creación de Plataformas
 
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesDesarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agiles
 
Jobsket Spring 2GX Madrid
Jobsket Spring 2GX MadridJobsket Spring 2GX Madrid
Jobsket Spring 2GX Madrid
 
Mejorando la productividad en proyectos java EE con CI y CD - OTN 2015
Mejorando la productividad en proyectos java EE con  CI y CD - OTN 2015 Mejorando la productividad en proyectos java EE con  CI y CD - OTN 2015
Mejorando la productividad en proyectos java EE con CI y CD - OTN 2015
 
Eleva tu capacidad con Groovy
Eleva tu capacidad con GroovyEleva tu capacidad con Groovy
Eleva tu capacidad con Groovy
 
Grails en el Fonasol
Grails en el FonasolGrails en el Fonasol
Grails en el Fonasol
 
20170405 - Ecosistema Javascript
20170405 - Ecosistema Javascript20170405 - Ecosistema Javascript
20170405 - Ecosistema Javascript
 
Java mission control para monitoreo, administración y profilig de aplicacione...
Java mission control para monitoreo, administración y profilig de aplicacione...Java mission control para monitoreo, administración y profilig de aplicacione...
Java mission control para monitoreo, administración y profilig de aplicacione...
 
WebRTC en tu web con OpenVidu
WebRTC en tu web con OpenViduWebRTC en tu web con OpenVidu
WebRTC en tu web con OpenVidu
 
OpenVidu Commitconf 2018
OpenVidu Commitconf 2018 OpenVidu Commitconf 2018
OpenVidu Commitconf 2018
 
GraalVM - MálagaJUG 2018-11-29
GraalVM - MálagaJUG 2018-11-29GraalVM - MálagaJUG 2018-11-29
GraalVM - MálagaJUG 2018-11-29
 
Gradle vs Maven
Gradle vs MavenGradle vs Maven
Gradle vs Maven
 
Ecuador jug 2017 -incrementando la productividad de proyectos java ee con c...
Ecuador jug   2017 -incrementando la productividad de proyectos java ee con c...Ecuador jug   2017 -incrementando la productividad de proyectos java ee con c...
Ecuador jug 2017 -incrementando la productividad de proyectos java ee con c...
 
Grails and Continuous delivery
Grails and Continuous deliveryGrails and Continuous delivery
Grails and Continuous delivery
 
PHP for Android: scripting PHP en Android
PHP for Android: scripting PHP en AndroidPHP for Android: scripting PHP en Android
PHP for Android: scripting PHP en Android
 
Cocoapods
CocoapodsCocoapods
Cocoapods
 

Viewers also liked

Madrid GUG - Grails Plugins: Exporter
Madrid GUG - Grails Plugins: ExporterMadrid GUG - Grails Plugins: Exporter
Madrid GUG - Grails Plugins: ExporterIván López Martín
 
Groovy no es java sin punto y coma v3
Groovy no es java sin punto y coma v3Groovy no es java sin punto y coma v3
Groovy no es java sin punto y coma v3Pablo Alba
 
Groovy - Grails as a modern scripting language for Web applications
Groovy - Grails as a modern scripting language for Web applicationsGroovy - Grails as a modern scripting language for Web applications
Groovy - Grails as a modern scripting language for Web applicationsIndicThreads
 
Geb+spock: let your functional tests live long and prosper
Geb+spock: let your functional tests live long and prosperGeb+spock: let your functional tests live long and prosper
Geb+spock: let your functional tests live long and prosperEsther Lozano
 
GriffDnie (Griffon Demo)
GriffDnie (Griffon Demo)GriffDnie (Griffon Demo)
GriffDnie (Griffon Demo)Jorge Aguilera
 
Macro macro, burrito burrit
Macro macro, burrito burritMacro macro, burrito burrit
Macro macro, burrito burritMario García
 
Presentación caballero carmelo
Presentación caballero carmeloPresentación caballero carmelo
Presentación caballero carmeloMarin Valencia
 
El Caballero Carmelo Historieta
El Caballero Carmelo   HistorietaEl Caballero Carmelo   Historieta
El Caballero Carmelo HistorietaPercy Martinez
 

Viewers also liked (14)

Madrid GUG - Grails Plugins: Exporter
Madrid GUG - Grails Plugins: ExporterMadrid GUG - Grails Plugins: Exporter
Madrid GUG - Grails Plugins: Exporter
 
Jedi knight
Jedi knightJedi knight
Jedi knight
 
Groovy no es java sin punto y coma v3
Groovy no es java sin punto y coma v3Groovy no es java sin punto y coma v3
Groovy no es java sin punto y coma v3
 
Groovy - Grails as a modern scripting language for Web applications
Groovy - Grails as a modern scripting language for Web applicationsGroovy - Grails as a modern scripting language for Web applications
Groovy - Grails as a modern scripting language for Web applications
 
Geb+spock: let your functional tests live long and prosper
Geb+spock: let your functional tests live long and prosperGeb+spock: let your functional tests live long and prosper
Geb+spock: let your functional tests live long and prosper
 
De Java a Swift pasando por Groovy
De Java a Swift pasando por GroovyDe Java a Swift pasando por Groovy
De Java a Swift pasando por Groovy
 
GriffDnie (Griffon Demo)
GriffDnie (Griffon Demo)GriffDnie (Griffon Demo)
GriffDnie (Griffon Demo)
 
Macro macro, burrito burrit
Macro macro, burrito burritMacro macro, burrito burrit
Macro macro, burrito burrit
 
Abraham Valdelomar
Abraham ValdelomarAbraham Valdelomar
Abraham Valdelomar
 
Presentación caballero carmelo
Presentación caballero carmeloPresentación caballero carmelo
Presentación caballero carmelo
 
EL CABALLERO CARMELO
EL CABALLERO CARMELOEL CABALLERO CARMELO
EL CABALLERO CARMELO
 
Abraham valdelomar
Abraham valdelomarAbraham valdelomar
Abraham valdelomar
 
El Caballero Carmelo Historieta
El Caballero Carmelo   HistorietaEl Caballero Carmelo   Historieta
El Caballero Carmelo Historieta
 
Gorm for cassandra
Gorm for cassandraGorm for cassandra
Gorm for cassandra
 

Similar to T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!

Webinar: Groovy y la producttividad para el desarrollador Java
Webinar: Groovy y la producttividad para el desarrollador JavaWebinar: Groovy y la producttividad para el desarrollador Java
Webinar: Groovy y la producttividad para el desarrollador JavaDomingo Suarez Torres
 
Webminar: Java como una plataforma Poliglota
Webminar: Java como una plataforma PoliglotaWebminar: Java como una plataforma Poliglota
Webminar: Java como una plataforma PoliglotaDomingo Suarez Torres
 
My programming language 04 05-2014
My programming language 04 05-2014My programming language 04 05-2014
My programming language 04 05-2014Neptuno Networks
 
ventajas y desventajas de programas informaticos
ventajas y desventajas de programas informaticosventajas y desventajas de programas informaticos
ventajas y desventajas de programas informaticosIrving Muñoz
 
ventajas y desventajas de programas informaticos
ventajas y desventajas de programas informaticosventajas y desventajas de programas informaticos
ventajas y desventajas de programas informaticosIrving Muñoz
 
Java completo y agragado
Java completo y agragadoJava completo y agragado
Java completo y agragadoMaria
 
Java completo y agragado
Java completo y agragadoJava completo y agragado
Java completo y agragadoMaria
 
Lenguajes de programación para la web
Lenguajes de programación para la webLenguajes de programación para la web
Lenguajes de programación para la webOscar Luis Cdrc
 
Tecnologia web
Tecnologia webTecnologia web
Tecnologia webfanyto
 
Hack x crack_java
Hack x crack_javaHack x crack_java
Hack x crack_javaSaviotec
 
Gwt seminario java_hispano_manolocarrasco
Gwt seminario java_hispano_manolocarrascoGwt seminario java_hispano_manolocarrasco
Gwt seminario java_hispano_manolocarrascoManuel Carrasco Moñino
 
Universidad nacional de chimborazo
Universidad nacional de chimborazoUniversidad nacional de chimborazo
Universidad nacional de chimborazoJesica Pérez
 

Similar to T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras! (20)

grails.org.mx Primera Reunion
grails.org.mx Primera Reuniongrails.org.mx Primera Reunion
grails.org.mx Primera Reunion
 
Introduccion a Groovy
Introduccion a GroovyIntroduccion a Groovy
Introduccion a Groovy
 
Cuestionario
CuestionarioCuestionario
Cuestionario
 
Webinar: Groovy y la producttividad para el desarrollador Java
Webinar: Groovy y la producttividad para el desarrollador JavaWebinar: Groovy y la producttividad para el desarrollador Java
Webinar: Groovy y la producttividad para el desarrollador Java
 
Webminar: Java como una plataforma Poliglota
Webminar: Java como una plataforma PoliglotaWebminar: Java como una plataforma Poliglota
Webminar: Java como una plataforma Poliglota
 
My programming language 04 05-2014
My programming language 04 05-2014My programming language 04 05-2014
My programming language 04 05-2014
 
Java poliglota
Java poliglotaJava poliglota
Java poliglota
 
Java script
Java scriptJava script
Java script
 
ventajas y desventajas de programas informaticos
ventajas y desventajas de programas informaticosventajas y desventajas de programas informaticos
ventajas y desventajas de programas informaticos
 
ventajas y desventajas de programas informaticos
ventajas y desventajas de programas informaticosventajas y desventajas de programas informaticos
ventajas y desventajas de programas informaticos
 
Gwt I - entendiendo gwt
Gwt I - entendiendo gwtGwt I - entendiendo gwt
Gwt I - entendiendo gwt
 
Java completo y agragado
Java completo y agragadoJava completo y agragado
Java completo y agragado
 
Java completo y agragado
Java completo y agragadoJava completo y agragado
Java completo y agragado
 
Lenguajes de programación para la web
Lenguajes de programación para la webLenguajes de programación para la web
Lenguajes de programación para la web
 
Grails barcamp 2013
Grails barcamp 2013Grails barcamp 2013
Grails barcamp 2013
 
Tecnologia web
Tecnologia webTecnologia web
Tecnologia web
 
Hack x crack_java
Hack x crack_javaHack x crack_java
Hack x crack_java
 
Hack x crack_java
Hack x crack_javaHack x crack_java
Hack x crack_java
 
Gwt seminario java_hispano_manolocarrasco
Gwt seminario java_hispano_manolocarrascoGwt seminario java_hispano_manolocarrasco
Gwt seminario java_hispano_manolocarrasco
 
Universidad nacional de chimborazo
Universidad nacional de chimborazoUniversidad nacional de chimborazo
Universidad nacional de chimborazo
 

More from Iván López Martín

CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersIván López Martín
 
Voxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdf
Voxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdfVoxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdf
Voxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdfIván López Martín
 
VMware - Testcontainers y Spring Boot
VMware - Testcontainers y Spring BootVMware - Testcontainers y Spring Boot
VMware - Testcontainers y Spring BootIván López Martín
 
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud GatewaySpring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud GatewayIván López Martín
 
Codemotion Madrid 2023 - Testcontainers y Spring Boot
Codemotion Madrid 2023 - Testcontainers y Spring BootCodemotion Madrid 2023 - Testcontainers y Spring Boot
Codemotion Madrid 2023 - Testcontainers y Spring BootIván López Martín
 
CommitConf 2023 - Spring Framework 6 y Spring Boot 3
CommitConf 2023 - Spring Framework 6 y Spring Boot 3CommitConf 2023 - Spring Framework 6 y Spring Boot 3
CommitConf 2023 - Spring Framework 6 y Spring Boot 3Iván López Martín
 
Construyendo un API REST con Spring Boot y GraalVM
Construyendo un API REST con Spring Boot y GraalVMConstruyendo un API REST con Spring Boot y GraalVM
Construyendo un API REST con Spring Boot y GraalVMIván López Martín
 
jLove 2020 - Micronaut and graalvm: The power of AoT
jLove 2020 - Micronaut and graalvm: The power of AoTjLove 2020 - Micronaut and graalvm: The power of AoT
jLove 2020 - Micronaut and graalvm: The power of AoTIván López Martín
 
Codemotion Madrid 2020 - Serverless con Micronaut
Codemotion Madrid 2020 - Serverless con MicronautCodemotion Madrid 2020 - Serverless con Micronaut
Codemotion Madrid 2020 - Serverless con MicronautIván López Martín
 
JConf Perú 2020 - ¡Micronaut en acción!
JConf Perú 2020 - ¡Micronaut en acción!JConf Perú 2020 - ¡Micronaut en acción!
JConf Perú 2020 - ¡Micronaut en acción!Iván López Martín
 
JConf Perú 2020 - Micronaut + GraalVM = <3
JConf Perú 2020 - Micronaut + GraalVM = <3JConf Perú 2020 - Micronaut + GraalVM = <3
JConf Perú 2020 - Micronaut + GraalVM = <3Iván López Martín
 
JConf México 2020 - Micronaut + GraalVM = <3
JConf México 2020 - Micronaut + GraalVM = <3JConf México 2020 - Micronaut + GraalVM = <3
JConf México 2020 - Micronaut + GraalVM = <3Iván López Martín
 
Developing Micronaut Applications With IntelliJ IDEA
Developing Micronaut Applications With IntelliJ IDEADeveloping Micronaut Applications With IntelliJ IDEA
Developing Micronaut Applications With IntelliJ IDEAIván López Martín
 
CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
CommitConf 2019 - Micronaut y GraalVm: La combinación perfectaCommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
CommitConf 2019 - Micronaut y GraalVm: La combinación perfectaIván López Martín
 
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!Iván López Martín
 
Greach 2019 - Creating Micronaut Configurations
Greach 2019 - Creating Micronaut ConfigurationsGreach 2019 - Creating Micronaut Configurations
Greach 2019 - Creating Micronaut ConfigurationsIván López Martín
 
VoxxedDays Bucharest 2019 - Alexa, nice to meet you
VoxxedDays Bucharest 2019 - Alexa, nice to meet youVoxxedDays Bucharest 2019 - Alexa, nice to meet you
VoxxedDays Bucharest 2019 - Alexa, nice to meet youIván López Martín
 
JavaDay Lviv 2019 - Micronaut in action!
JavaDay Lviv 2019 - Micronaut in action!JavaDay Lviv 2019 - Micronaut in action!
JavaDay Lviv 2019 - Micronaut in action!Iván López Martín
 
CrossDvlup Madrid 2019 - Alexa, encantado de conocerte
CrossDvlup Madrid 2019 - Alexa, encantado de conocerteCrossDvlup Madrid 2019 - Alexa, encantado de conocerte
CrossDvlup Madrid 2019 - Alexa, encantado de conocerteIván López Martín
 
Madrid-GUG - ¡Micronaut en acción!
Madrid-GUG - ¡Micronaut en acción!Madrid-GUG - ¡Micronaut en acción!
Madrid-GUG - ¡Micronaut en acción!Iván López Martín
 

More from Iván López Martín (20)

CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
 
Voxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdf
Voxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdfVoxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdf
Voxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdf
 
VMware - Testcontainers y Spring Boot
VMware - Testcontainers y Spring BootVMware - Testcontainers y Spring Boot
VMware - Testcontainers y Spring Boot
 
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud GatewaySpring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
 
Codemotion Madrid 2023 - Testcontainers y Spring Boot
Codemotion Madrid 2023 - Testcontainers y Spring BootCodemotion Madrid 2023 - Testcontainers y Spring Boot
Codemotion Madrid 2023 - Testcontainers y Spring Boot
 
CommitConf 2023 - Spring Framework 6 y Spring Boot 3
CommitConf 2023 - Spring Framework 6 y Spring Boot 3CommitConf 2023 - Spring Framework 6 y Spring Boot 3
CommitConf 2023 - Spring Framework 6 y Spring Boot 3
 
Construyendo un API REST con Spring Boot y GraalVM
Construyendo un API REST con Spring Boot y GraalVMConstruyendo un API REST con Spring Boot y GraalVM
Construyendo un API REST con Spring Boot y GraalVM
 
jLove 2020 - Micronaut and graalvm: The power of AoT
jLove 2020 - Micronaut and graalvm: The power of AoTjLove 2020 - Micronaut and graalvm: The power of AoT
jLove 2020 - Micronaut and graalvm: The power of AoT
 
Codemotion Madrid 2020 - Serverless con Micronaut
Codemotion Madrid 2020 - Serverless con MicronautCodemotion Madrid 2020 - Serverless con Micronaut
Codemotion Madrid 2020 - Serverless con Micronaut
 
JConf Perú 2020 - ¡Micronaut en acción!
JConf Perú 2020 - ¡Micronaut en acción!JConf Perú 2020 - ¡Micronaut en acción!
JConf Perú 2020 - ¡Micronaut en acción!
 
JConf Perú 2020 - Micronaut + GraalVM = <3
JConf Perú 2020 - Micronaut + GraalVM = <3JConf Perú 2020 - Micronaut + GraalVM = <3
JConf Perú 2020 - Micronaut + GraalVM = <3
 
JConf México 2020 - Micronaut + GraalVM = <3
JConf México 2020 - Micronaut + GraalVM = <3JConf México 2020 - Micronaut + GraalVM = <3
JConf México 2020 - Micronaut + GraalVM = <3
 
Developing Micronaut Applications With IntelliJ IDEA
Developing Micronaut Applications With IntelliJ IDEADeveloping Micronaut Applications With IntelliJ IDEA
Developing Micronaut Applications With IntelliJ IDEA
 
CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
CommitConf 2019 - Micronaut y GraalVm: La combinación perfectaCommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
 
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
 
Greach 2019 - Creating Micronaut Configurations
Greach 2019 - Creating Micronaut ConfigurationsGreach 2019 - Creating Micronaut Configurations
Greach 2019 - Creating Micronaut Configurations
 
VoxxedDays Bucharest 2019 - Alexa, nice to meet you
VoxxedDays Bucharest 2019 - Alexa, nice to meet youVoxxedDays Bucharest 2019 - Alexa, nice to meet you
VoxxedDays Bucharest 2019 - Alexa, nice to meet you
 
JavaDay Lviv 2019 - Micronaut in action!
JavaDay Lviv 2019 - Micronaut in action!JavaDay Lviv 2019 - Micronaut in action!
JavaDay Lviv 2019 - Micronaut in action!
 
CrossDvlup Madrid 2019 - Alexa, encantado de conocerte
CrossDvlup Madrid 2019 - Alexa, encantado de conocerteCrossDvlup Madrid 2019 - Alexa, encantado de conocerte
CrossDvlup Madrid 2019 - Alexa, encantado de conocerte
 
Madrid-GUG - ¡Micronaut en acción!
Madrid-GUG - ¡Micronaut en acción!Madrid-GUG - ¡Micronaut en acción!
Madrid-GUG - ¡Micronaut en acción!
 

Recently uploaded

LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfedepmariaperez
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfFernandoOblitasVivan
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptchaverriemily794
 
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptx
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptxLINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptx
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptxkimontey
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)JuanStevenTrujilloCh
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptxHugoGutierrez99
 
David_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDavid_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDAVIDROBERTOGALLEGOS
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerenciacubillannoly
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfKarinaCambero3
 
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...Marketing BRANDING
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docxobandopaula444
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024u20211198540
 
Viguetas Pretensadas en concreto armado
Viguetas Pretensadas  en concreto armadoViguetas Pretensadas  en concreto armado
Viguetas Pretensadas en concreto armadob7fwtwtfxf
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosAlbanyMartinez7
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdfBetianaJuarez1
 
Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar24roberto21
 

Recently uploaded (20)

LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdf
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdf
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
 
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptx
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptxLINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptx
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptx
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)
 
El camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVPEl camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVP
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
 
David_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDavid_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptx
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerencia
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdf
 
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
 
Viguetas Pretensadas en concreto armado
Viguetas Pretensadas  en concreto armadoViguetas Pretensadas  en concreto armado
Viguetas Pretensadas en concreto armado
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos Juridicos
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
 
Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar
 

T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!

  • 1. De Java a Groovy: ¡Hora de Aventuras! Iván López @ilopmar
  • 2. ➢ Iván López @ilopmar ➢ Groovy & Grails developer ➢ Coordinador de @madridgug ➢ Organizador de Greach @greachconf http://greachconf.com ➢ Speaker: SpringOne 2GX, GR8Conf, GGX, Codemotion, GeeCon, jDays, Spring IO, Greach, ConFess,... Sobre mí...
  • 4. “Groovy es un lenguaje dinámico poderoso, opcionalmente tipado, con capacidad de tipado y compilación estáticos para la plataforma Java centrado en multiplicar la productividad de los desarrolladores gracias a una sintaxis concisa, familiar y fácil de aprender. Se integra sin problemas con cualquier programa Java e inmediatamente proporciona a tu aplicación poderosas características como capacidades de scripting, DSLs, metaprogramación en runtime y compile-time y programación funcional. – Web de Groovy
  • 5. “Groovy es un lenguaje dinámico poderoso, opcionalmente tipado, con capacidad de tipado y compilación estáticos para la plataforma Java centrado en multiplicar la productividad de los desarrolladores gracias a una sintaxis concisa, familiar y fácil de aprender. Se integra sin problemas con cualquier programa Java e inmediatamente proporciona a tu aplicación poderosas características como capacidades de scripting, DSLs, metaprogramación en runtime y compile-time y programación funcional. – Web de Groovy
  • 6. “Groovy es un lenguaje dinámico poderoso, opcionalmente tipado, con capacidad de tipado y compilación estáticos para la plataforma Java centrado en multiplicar la productividad de los desarrolladores gracias a una sintaxis concisa, familiar y fácil de aprender. Se integra sin problemas con cualquier programa Java e inmediatamente proporciona a tu aplicación poderosas características como capacidades de scripting, DSLs, metaprogramación en runtime y compile-time y programación funcional. – Web de Groovy
  • 7. “Groovy es un lenguaje dinámico poderoso, opcionalmente tipado, con capacidad de tipado y compilación estáticos para la plataforma Java centrado en multiplicar la productividad de los desarrolladores gracias a una sintaxis concisa, familiar y fácil de aprender. Se integra sin problemas con cualquier programa Java e inmediatamente proporciona a tu aplicación poderosas características como capacidades de scripting, DSLs, metaprogramación en runtime y compile-time y programación funcional. – Web de Groovy
  • 8. “Groovy es un lenguaje dinámico poderoso, opcionalmente tipado, con capacidad de tipado y compilación estáticos para la plataforma Java centrado en multiplicar la productividad de los desarrolladores gracias a una sintaxis concisa, familiar y fácil de aprender. Se integra sin problemas con cualquier programa Java e inmediatamente proporciona a tu aplicación poderosas características como capacidades de scripting, DSLs, metaprogramación en runtime y compile-time y programación funcional. – Web de Groovy
  • 9. “Groovy es un lenguaje dinámico poderoso, opcionalmente tipado, con capacidad de tipado y compilación estáticos para la plataforma Java centrado en multiplicar la productividad de los desarrolladores gracias a una sintaxis concisa, familiar y fácil de aprender. Se integra sin problemas con cualquier programa Java e inmediatamente proporciona a tu aplicación poderosas características como capacidades de scripting, DSLs, metaprogramación en runtime y compile-time y programación funcional. – Web de Groovy
  • 10. “Groovy es un lenguaje dinámico poderoso, opcionalmente tipado, con capacidad de tipado y compilación estáticos para la plataforma Java centrado en multiplicar la productividad de los desarrolladores gracias a una sintaxis concisa, familiar y fácil de aprender. Se integra sin problemas con cualquier programa Java e inmediatamente proporciona a tu aplicación poderosas características como capacidades de scripting, DSLs, metaprogramación en runtime y compile-time y programación funcional. – Web de Groovy
  • 11. “Groovy es un lenguaje dinámico poderoso, opcionalmente tipado, con capacidad de tipado y compilación estáticos para la plataforma Java centrado en multiplicar la productividad de los desarrolladores gracias a una sintaxis concisa, familiar y fácil de aprender. Se integra sin problemas con cualquier programa Java e inmediatamente proporciona a tu aplicación poderosas características como capacidades de scripting, DSLs, metaprogramación en runtime y compile-time y programación funcional. – Web de Groovy
  • 12. “Groovy es un lenguaje dinámico poderoso, opcionalmente tipado, con capacidad de tipado y compilación estáticos para la plataforma Java centrado en multiplicar la productividad de los desarrolladores gracias a una sintaxis concisa, familiar y fácil de aprender. Se integra sin problemas con cualquier programa Java e inmediatamente proporciona a tu aplicación poderosas características como capacidades de scripting, DSLs, metaprogramación en runtime y compile-time y programación funcional. – Web de Groovy
  • 13. “Groovy es un lenguaje dinámico poderoso, opcionalmente tipado, con capacidad de tipado y compilación estáticos para la plataforma Java centrado en multiplicar la productividad de los desarrolladores gracias a una sintaxis concisa, familiar y fácil de aprender. Se integra sin problemas con cualquier programa Java e inmediatamente proporciona a tu aplicación poderosas características como capacidades de scripting, DSLs, metaprogramación en runtime y compile-time y programación funcional. – Web de Groovy
  • 14. “Groovy es un lenguaje dinámico poderoso, opcionalmente tipado, con capacidad de tipado y compilación estáticos para la plataforma Java centrado en multiplicar la productividad de los desarrolladores gracias a una sintaxis concisa, familiar y fácil de aprender. Se integra sin problemas con cualquier programa Java e inmediatamente proporciona a tu aplicación poderosas características como capacidades de scripting, DSLs, metaprogramación en runtime y compile-time y programación funcional. – Web de Groovy
  • 16. 2. ¿Y por qué no Java?
  • 17. ➢ Java es sólido ➢ Conocido por muchos desarrolladores ➢ Muy extendido ➢ Es rápido Pero... ➢ Java es verboso ➢ Puede ser incómodo en algunos casos ➢ No es dinámico ¿Y por qué no Java?
  • 19. public class Saludador { private String saludo; public void diHolaA(String... nombres) { String mensajeSaludo = prepararMensajeSaludo(nombres); System.out.println(mensajeSaludo); } public String getSaludo() { return saludo; } public void setSaludo(String saludo) { this.saludo = saludo; } private String prepararMensajeSaludo(String... nombres) { String delimitador = ""; StringBuilder sb = new StringBuilder(); for (String nombre : nombres) { sb.append(delimitador).append(nombre); delimitador = ", "; } return this.saludo + " " + sb.toString() + "!"; } public static void main(String[] args) { final Saludador saludador = new Saludador(); saludador.setSaludo("Hola"); saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard"); } } Saludador.java Renombrar
  • 20. public class Saludador { private String saludo; public void diHolaA(String... nombres) { String mensajeSaludo = prepararMensajeSaludo(nombres); System.out.println(mensajeSaludo); } public String getSaludo() { return saludo; } public void setSaludo(String saludo) { this.saludo = saludo; } private String prepararMensajeSaludo(String... nombres) { String delimitador = ""; StringBuilder sb = new StringBuilder(); for (String nombre : nombres) { sb.append(delimitador).append(nombre); delimitador = ", "; } return this.saludo + " " + sb.toString() + "!"; } public static void main(String[] args) { final Saludador saludador = new Saludador(); saludador.setSaludo("Hola"); saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard"); } } Saludador.groovy
  • 21. public class Saludador { private String saludo; public void diHolaA(String... nombres) { String mensajeSaludo = prepararMensajeSaludo(nombres); System.out.println(mensajeSaludo); } public String getSaludo() { return saludo; } public void setSaludo(String saludo) { this.saludo = saludo; } private String prepararMensajeSaludo(String... nombres) { String delimitador = ""; StringBuilder sb = new StringBuilder(); for (String nombre : nombres) { sb.append(delimitador).append(nombre); delimitador = ", "; } return this.saludo + " " + sb.toString() + "!"; } public static void main(String[] args) { final Saludador saludador = new Saludador(); saludador.setSaludo("Hola"); saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard"); } } Groovy
  • 22. public class Saludador { private String saludo public void diHolaA(String... nombres) { String mensajeSaludo = prepararMensajeSaludo(nombres) System.out.println(mensajeSaludo) } public String getSaludo() { return saludo } public void setSaludo(String saludo) { this.saludo = saludo } private String prepararMensajeSaludo(String... nombres) { String delimitador = "" StringBuilder sb = new StringBuilder() for (String nombre : nombres) { sb.append(delimitador).append(nombre) delimitador = ", " } return this.saludo + " " + sb.toString() + "!" } public static void main(String[] args) { final Saludador saludador = new Saludador() saludador.setSaludo("Hola") saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard") } } opcional opcional Groovy
  • 23. class Saludador { private String saludo void diHolaA(String... nombres) { String mensajeSaludo = prepararMensajeSaludo(nombres) System.out.println(mensajeSaludo) } String getSaludo() { return saludo } void setSaludo(String saludo) { this.saludo = saludo } private String prepararMensajeSaludo(String... nombres) { String delimitador = "" StringBuilder sb = new StringBuilder() for (String nombre : nombres) { sb.append(delimitador).append(nombre) delimitador = ", " } return this.saludo + " " + sb.toString() + "!" } static void main(String[] args) { final Saludador saludador = new Saludador() saludador.setSaludo("Hola") saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard") } } getter y setter verbosos Groovy
  • 24. class Saludador { String saludo void diHolaA(String... nombres) { String mensajeSaludo = prepararMensajeSaludo(nombres) System.out.println(mensajeSaludo) } private String prepararMensajeSaludo(String... nombres) { String delimitador = "" StringBuilder sb = new StringBuilder() for (String nombre : nombres) { sb.append(delimitador).append(nombre) delimitador = ", " } return this.saludo + " " + sb.toString() + "!" } static void main(String[] args) { final Saludador saludador = new Saludador() saludador.setSaludo("Hola") saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard") } } Acceso como propiedad Groovy
  • 25. class Saludador { String saludo void diHolaA(String... nombres) { String mensajeSaludo = prepararMensajeSaludo(nombres) System.out.println(mensajeSaludo) } private String prepararMensajeSaludo(String... nombres) { String delimitador = "" StringBuilder sb = new StringBuilder() for (String nombre : nombres) { sb.append(delimitador).append(nombre) delimitador = ", " } return this.saludo + " " + sb.toString() + "!" } static void main(String[] args) { final Saludador saludador = new Saludador() saludador.saludo = "Hola" saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard") } } opcional Groovy
  • 26. class Saludador { String saludo void diHolaA(String... nombres) { String mensajeSaludo = prepararMensajeSaludo(nombres) System.out.println(mensajeSaludo) } private String prepararMensajeSaludo(String... nombres) { String delimitador = "" StringBuilder sb = new StringBuilder() for (String nombre : nombres) { sb.append(delimitador).append(nombre) delimitador = ", " } this.saludo + " " + sb.toString() + "!" } static void main(String[] args) { final Saludador saludador = new Saludador() saludador.saludo = "Hola" saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard") } } atajo Groovy
  • 27. class Saludador { String saludo void diHolaA(String... nombres) { String mensajeSaludo = prepararMensajeSaludo(nombres) println(mensajeSaludo) } private String prepararMensajeSaludo(String... nombres) { String delimitador = "" StringBuilder sb = new StringBuilder() for (String nombre : nombres) { sb.append(delimitador).append(nombre) delimitador = ", " } this.saludo + " " + sb.toString() + "!" } static void main(String[] args) { final Saludador saludador = new Saludador() saludador.saludo = "Hola" saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard") } } API de colecciones Groovy
  • 28. class Saludador { String saludo void diHolaA(String... nombres) { String mensajeSaludo = prepararMensajeSaludo(nombres) println(mensajeSaludo) } private String prepararMensajeSaludo(String... nombres) { String nombreUnidos = nombres.join(', ') this.saludo + " " + nombresUnidos + "!" } static void main(String[] args) { final Saludador saludador = new Saludador() saludador.saludo = "Hola" saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard") } } interpolación de String (GString) Groovy
  • 29. class Saludador { String saludo void diHolaA(String... nombres) { String mensajeSaludo = prepararMensajeSaludo(nombres) println(mensajeSaludo) } private String prepararMensajeSaludo(String... nombres) { String nombreUnidos = nombres.join(', ') "${this.saludo} $nombreUnidos!" } static void main(String[] args) { final Saludador saludador = new Saludador() saludador.saludo = "Hola" saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard") } } refactor Groovy
  • 30. class Saludador { String saludo void diHolaA(String... nombres) { String mensajeSaludo = prepararMensajeSaludo(nombres) println(mensajeSaludo) } private String prepararMensajeSaludo(String... nombres) { "$saludo ${nombres.join(', ')}!" } static void main(String[] args) { final Saludador saludador = new Saludador() saludador.saludo = "Hola" saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard") } } tipado opcional Groovy
  • 31. class Saludador { String saludo void diHolaA(String... nombres) { def mensajeSaludo = prepararMensajeSaludo(nombres) println(mensajeSaludo) } private String prepararMensajeSaludo(String... nombres) { "$saludo ${nombres.join(', ')}!" } static void main(String[] args) { def saludador = new Saludador() saludador.saludo = "Hola" saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard") } } named constructor Groovy
  • 32. class Saludador { String saludo void diHolaA(String... nombres) { def mensajeSaludo = prepararMensajeSaludo(nombres) println(mensajeSaludo) } private String prepararMensajeSaludo(String... nombres) { "$saludo ${nombres.join(', ')}!" } static void main(String[] args) { def saludador = new Saludador(saludo: 'Hola') saludador.diHolaA("Sheldon", "Leonard", "Raj", "Howard") } } paréntesis opcionales paréntesis opcionales Groovy
  • 33. class Saludador { String saludo void diHolaA(String... nombres) { def mensajeSaludo = prepararMensajeSaludo(nombres) println mensajeSaludo } private String prepararMensajeSaludo(String... nombres) { "$saludo ${nombres.join(', ')}!" } static void main(String[] args) { def saludador = new Saludador(saludo: 'Hola') saludador.diHolaA "Sheldon", "Leonard", "Raj", "Howard" } } main como script Groovy
  • 34. class Saludador { String saludo void diHolaA(String... nombres) { def mensajeSaludo = prepararMensajeSaludo(nombres) println mensajeSaludo } private String prepararMensajeSaludo(String... nombres) { "$saludo ${nombres.join(', ')}!" } } saludador = new Saludador(saludo: 'Hola') saludador.diHolaA "Sheldon", "Leonard", "Raj", "Howard" refactor Groovy
  • 35. class Saludador { String saludo void diHolaA(String... nombres) { println "$saludo ${nombres.join(', ')}!" } } saludador = new Saludador(saludo: 'Hola') saludador.diHolaA "Sheldon", "Leonard", "Raj", "Howard" Limpiemos los espacios Groovy
  • 36. class Saludador { String saludo void diHolaA(String... nombres) { println "$saludo ${nombres.join(', ')}!" } } saludador = new Saludador(saludo: 'Hola') saludador.diHolaA "Sheldon", "Leonard", "Raj", "Howard" Groovy: Versión final
  • 37. class Saludador { String saludo void diHolaA(String... nombres) { println "$saludo ${nombres.join(', ')}!" } } saludador = new Saludador(saludo: 'Hola') saludador.diHolaA "Sheldon", "Leonard", "Raj", "Howard" Groovy: Versión final Java 32 líneas 900 caracteres Groovy 10 líneas 231 caracteres Diferencia 68% 74%
  • 38. Groovy: ¡Hora de Aventuras!
  • 40. ➢ Dinámico ➢ Compilación estática opcional ➢ Todo es un objeto ➢ Sobrecarga de operadores ➢ + es .plus() ➢ * es .multiply() ➢ Sintaxis nativa de listas, mapas y rangos ➢ Métodos y clases public por defecto ➢ Las excepciones son unchecked ➢ http://groovy-lang.org/differences.html Diferencias entre Java y Groovy
  • 41. Getters y setters public class Persona { private String nombre; private int edad; String getNombre() { return nombre; } void setNombre(String nombre) { this.nombre = nombre; } int getEdad() { return edad; } void setEdad(int edad) { this.edad = edad; } }
  • 42. Getters y setters public class Persona { private String nombre; private int edad; String getNombre() { return nombre; } void setNombre(String nombre) { this.nombre = nombre; } int getEdad() { return edad; } void setEdad(int edad) { this.edad = edad; } } class Persona { String nombre int edad }
  • 43. Named constructors class Persona { String nombre int edad } def p = new Persona(nombre: 'Iván', edad: 36) assert p.nombre == 'Iván' p.edad = 37 assert p.edad == 37
  • 44. Constructor Builder import groovy.transform.builder.Builder @Builder class Persona { String nombre int edad } Persona.builder() .nombre('Iván') .edad(36) .build()
  • 45. Números que... System.out.println(2.00 - 1.1); // 0.8999999999999999
  • 46. Números que... System.out.println(2.00 - 1.1); // 0.8999999999999999
  • 49. ¡BigDecimal por defecto! assert 2.0 - 1.1 == 0.9 assert 3 / 2 == 1.5
  • 50. Equals y == estado != null && estado.equals(Estado.COMPLETADO);
  • 51. Equals y == estado == Estado.COMPLETADO estado != null && estado.equals(Estado.COMPLETADO);
  • 52. Strings y GString def nombre = 'Iván' def edad = 36 println "¡Hola ${nombre}, tienes ${edad} años!" def query = """ insert into people (firstName, age) values (${nombre}, ${edad}) """ new Sql(datasource).execute query
  • 53. Strings y GString def nombre = 'Iván' def edad = 36 println "¡Hola ${nombre}, tienes ${edad} años!" def query = """ insert into people (firstName, age) values (${nombre}, ${edad}) """ new Sql(datasource).execute query
  • 54. Listas def list = ['a', 'b', 'c'] list << 'd' // list.add(“d”) assert list.contains('d') assert list.collect { it.toUpperCase() } == ['A', 'B', 'C', 'D'] assert list.findAll { it.startsWith 'a' }.size() == 1
  • 55. Listas def list = ['a', 'b', 'c'] list << 'd' // list.add(“d”) assert list.contains('d') assert list.collect { it.toUpperCase() } == ['A', 'B', 'C', 'D'] assert list.findAll { it.startsWith 'a' }.size() == 1
  • 56. Listas def list = ['a', 'b', 'c'] list << 'd' // list.add(“d”) assert list.contains('d') assert list.collect { it.toUpperCase() } == ['A', 'B', 'C', 'D'] assert list.findAll { it.startsWith 'a' }.size() == 1
  • 57. Mapas def map = [nombre: 'Iván', edad: 36] assert map.nombre == 'Iván' map.hijas = ['Judith', 'Adriana'] assert map['hijas'].contains('Adriana')
  • 58. Mapas def map = [nombre: 'Iván', edad: 36] assert map.nombre == 'Iván' map.hijas = ['Judith', 'Adriana'] assert map['hijas'].contains('Adriana') def map = [nombre: 'Iván', edad: 36] assert map.nombre == 'Iván' map.hijas = ['Judith', 'Adriana'] assert map['hijas'].contains('Adriana')
  • 59. Rangos def rango = 'a'..'z' assert rango.contains('i') assert rango.contains('z') def exclusivo = 1..<10 assert !exclusivo.contains(10) def inverso = 10..1 assert inverso[0] == 10 assert inverso[-1] == 1
  • 60. Rangos def rango = 'a'..'z' assert rango.contains('i') assert rango.contains('z') def exclusivo = 1..<10 assert !exclusivo.contains(10) def inverso = 10..1 assert inverso[0] == 10 assert inverso[-1] == 1
  • 61. Rangos def rango = 'a'..'z' assert rango.contains('i') assert rango.contains('z') def exclusivo = 1..<10 assert !exclusivo.contains(10) def inverso = 10..1 assert inverso[0] == 10 assert inverso[-1] == 1
  • 62. Groovy truth assert !( null ) assert !( "" ) assert !( '' ) assert !( [] ) assert !( [:] ) assert !( 0 )
  • 63. Groovy truth false assert !( null ) assert !( "" ) assert !( '' ) assert !( [] ) assert !( [:] ) assert !( 0 )
  • 64. Groovy truth assert new Object() assert "string" assert 'string' assert [1, 2] assert [a: 1] assert 1 false assert !( null ) assert !( "" ) assert !( '' ) assert !( [] ) assert !( [:] ) assert !( 0 )
  • 65. Groovy truth assert new Object() assert "string" assert 'string' assert [1, 2] assert [a: 1] assert 1 false true assert !( null ) assert !( "" ) assert !( '' ) assert !( [] ) assert !( [:] ) assert !( 0 )
  • 66. Power asserts assert (2 + 7) * 5 != (2 * 5) + (7 * 5) (2 + 7) * 5 != (2 * 5) + (7 * 5) | | | | | | 9 45 false 10 45 35
  • 67. Power asserts assert (2 + 7) * 5 != (2 * 5) + (7 * 5) (2 + 7) * 5 != (2 * 5) + (7 * 5) | | | | | | 9 45 false 10 45 35
  • 68. Power asserts def info = [ nombre: 'Iván', edad: 36, hijas: [ [nombre: 'Judith', edad: 8], [nombre: 'Adriana', edad: 5] ] ] assert info.hijas.nombre.first() == 'Adriana' info.hijas.nombre.first() == 'Adriana' | | | | | | | | Judith false | | | 6 differences (14% similarity) | | | (Ju)d(-)i(th-) | | | (A-)d(r)i(ana) | | [Judith, Adriana] | [[nombre:Judith, edad:8], [nombre:Adriana, edad:5]] [nombre:Iván, edad:36, hijas:[[nombre:Judith, edad:8], [nombre:Adriana, edad:5]]]
  • 69. Power asserts def info = [ nombre: 'Iván', edad: 36, hijas: [ [nombre: 'Judith', edad: 8], [nombre: 'Adriana', edad: 5] ] ] assert info.hijas.nombre.first() == 'Adriana' info.hijas.nombre.first() == 'Adriana' | | | | | | | | Judith false | | | 6 differences (14% similarity) | | | (Ju)d(-)i(th-) | | | (A-)d(r)i(ana) | | [Judith, Adriana] | [[nombre:Judith, edad:8], [nombre:Adriana, edad:5]] [nombre:Iván, edad:36, hijas:[[nombre:Judith, edad:8], [nombre:Adriana, edad:5]]]
  • 70. Power asserts def info = [ nombre: 'Iván', edad: 36, hijas: [ [nombre: 'Judith', edad: 8], [nombre: 'Adriana', edad: 5] ] ] assert info.hijas.nombre.first() == 'Adriana' info.hijas.nombre.first() == 'Adriana' | | | | | | | | Judith false | | | 6 differences (14% similarity) | | | (Ju)d(-)i(th-) | | | (A-)d(r)i(ana) | | [Judith, Adriana] | [[nombre:Judith, edad:8], [nombre:Adriana, edad:5]] [nombre:Iván, edad:36, hijas:[[nombre:Judith, edad:8], [nombre:Adriana, edad:5]]]
  • 71. Power asserts def info = [ nombre: 'Iván', edad: 36, hijas: [ [nombre: 'Judith', edad: 8], [nombre: 'Adriana', edad: 5] ] ] assert info.hijas.nombre.first() == 'Adriana' info.hijas.nombre.first() == 'Adriana' | | | | | | | | Judith false | | | 6 differences (14% similarity) | | | (Ju)d(-)i(th-) | | | (A-)d(r)i(ana) | | [Judith, Adriana] | [[nombre:Judith, edad:8], [nombre:Adriana, edad:5]] [nombre:Iván, edad:36, hijas:[[nombre:Judith, edad:8], [nombre:Adriana, edad:5]]]
  • 72. Power asserts def info = [ nombre: 'Iván', edad: 36, hijas: [ [nombre: 'Judith', edad: 8], [nombre: 'Adriana', edad: 5] ] ] assert info.hijas.nombre.first() == 'Adriana' info.hijas.nombre.first() == 'Adriana' | | | | | | | | Judith false | | | 6 differences (14% similarity) | | | (Ju)d(-)i(th-) | | | (A-)d(r)i(ana) | | [Judith, Adriana] | [[nombre:Judith, edad:8], [nombre:Adriana, edad:5]] [nombre:Iván, edad:36, hijas:[[nombre:Judith, edad:8], [nombre:Adriana, edad:5]]]
  • 73. def info = [ nombre: 'Iván', edad: 36, hijas: [ [nombre: 'Judith', edad: 8], [nombre: 'Adriana', edad: 5] ] ] assert info.hijas.nombre.first() == 'Adriana' info.hijas.nombre.first() == 'Adriana' | | | | | | | | Judith false | | | 6 differences (14% similarity) | | | (Ju)d(-)i(th-) | | | (A-)d(r)i(ana) | | [Judith, Adriana] | [[nombre:Judith, edad:8], [nombre:Adriana, edad:5]] [nombre:Iván, edad:36, hijas:[[nombre:Judith, edad:8], [nombre:Adriana, edad:5]]] Power asserts
  • 74. Elvis List resultado = (nombres != null && nombres.size() > 0) ? nombres : Collections.emptyList();
  • 75. Elvis List resultado = (nombres != null && nombres.size() > 0) ? nombres : Collections.emptyList(); def resultado = nombres ? nombres : []
  • 76. Elvis List resultado = (nombres != null && nombres.size() > 0) ? nombres : Collections.emptyList(); def resultado = nombres ? nombres : [] def resultado = nombres ?: []
  • 77. Safe navigation if (order != null) { if (order.getCustomer() != null) { if (order.getCustomer().getAddress() != null) { System.out.println(order.getCustomer().getAddress()); } } }
  • 78. Safe navigation if (order != null) { if (order.getCustomer() != null) { if (order.getCustomer().getAddress() != null) { System.out.println(order.getCustomer().getAddress()); } } } println order?.customer?.address
  • 79. Closures def multiplicador = { a, b -> a * b } assert multiplicador(2, 3) == 6 assert multiplicador.call(2, 3) == 6 assert multiplicador('=', 8) == '========' def sumador = { ... numbers -> numbers.sum() } assert sumador(1, 2, 3) == 6 assert sumador('a', 'b', 'c') == 'abc' def multiplicador = { int a, int b -> a * b }
  • 80. def multiplicador = { a, b -> a * b } assert multiplicador(2, 3) == 6 assert multiplicador.call(2, 3) == 6 assert multiplicador('=', 8) == '========' def sumador = { ... numbers -> numbers.sum() } assert sumador(1, 2, 3) == 6 assert sumador('a', 'b', 'c') == 'abc' def multiplicador = { int a, int b -> a * b } Closures
  • 81. def multiplicador = { a, b -> a * b } assert multiplicador(2, 3) == 6 assert multiplicador.call(2, 3) == 6 assert multiplicador('=', 8) == '========' def sumador = { ... numbers -> numbers.sum() } assert sumador(1, 2, 3) == 6 assert sumador('a', 'b', 'c') == 'abc' def multiplicador = { int a, int b -> a * b } Closures
  • 82. Closures: Valores por defecto def multiplicador = { int a, int b = 10 -> a * b } assert multiplicador(2, 3) == 6 assert multiplicador(2) == 20
  • 83. Closures: Métodos como función def logBase10 = Math.&log10 assert logBase10(10) == 1
  • 84. Closures: map, filter, reduce def personas = [ new Persona('Iván', 36), new Persona('Judith', 8), new Persona('Adriana', 5) ] def nombres = personas.findAll { it.edad < 18 } .collect { it.nombre.toUpperCase() } .sort() .join(', ') assert nombres == 'ADRIANA, JUDITH'
  • 85. Closures: map, filter, reduce def personas = [ new Persona('Iván', 36), new Persona('Judith', 8), new Persona('Adriana', 5) ] def nombres = personas.findAll { it.edad < 18 } .collect { it.nombre.toUpperCase() } .sort() .join(', ') assert nombres == 'ADRIANA, JUDITH'
  • 86. Closures: map, filter, reduce def personas = [ new Persona('Iván', 36), new Persona('Judith', 8), new Persona('Adriana', 5) ] def nombres = personas.findAll { it.edad < 18 } .collect { it.nombre.toUpperCase() } .sort() .join(', ') assert nombres == 'ADRIANA, JUDITH'
  • 87. Groovy Closures y Java 8 Lambdas import static java.util.Arrays.asList; public class JavaLambdas { public static void main(String[] args) { asList(1, 2, 3).stream() .map(i -> i * 2) .filter(i -> i > 3) .findFirst() .orElseThrow(IllegalArgumentException::new); } }
  • 88. Groovy Closures y Java 8 Lambdas import static java.util.Arrays.asList; public class JavaLambdas { public static void main(String[] args) { asList(1, 2, 3).stream() .map(i -> i * 2) .filter(i -> i > 3) .findFirst() .orElseThrow(IllegalArgumentException::new); } } [1, 2, 3].stream() .map { i -> i * 2 } .filter { i -> i > 3 } .findFirst() .orElseThrow(IllegalArgumentException.&newInstance)
  • 89. Json builder { "speaker": { "firstName": "Iván", "lastName": "López", "address": { "city": "Madrid", "country": "España", "zip": 12345 }, "conferences": [ "T3chFest", "Codemotion", "Greach" ] } } import groovy.json.JsonBuilder def builder = new JsonBuilder() builder. speaker { firstName 'Iván' lastName 'López' address( city: 'Madrid', country: 'España', zip: 12345, ) conferences( 'T3chFest', 'Codemotion', 'Greach' ) } println builder.toPrettyString()
  • 90. Json builder { "speaker": { "firstName": "Iván", "lastName": "López", "address": { "city": "Madrid", "country": "España", "zip": 12345 }, "conferences": [ "T3chFest", "Codemotion", "Greach" ] } } import groovy.json.JsonBuilder def builder = new JsonBuilder() builder. speaker { firstName 'Iván' lastName 'López' address( city: 'Madrid', country: 'España', zip: 12345, ) conferences( 'T3chFest', 'Codemotion', 'Greach' ) } println builder.toPrettyString()
  • 91. Parsear XML y Json en Java
  • 92. Json parser wind: { speed: 2.1, deg: 350 }, clouds: { all: 75 }, dt: 1454061483, sys: { type: 1, id: 5488, message: 0.0046, country: "ES", sunrise: 1454052430, sunset: 1454088574 }, id: 3118594, name: "Leganes", cod: 200 } http://api.openweathermap.org/data/2.5/weather? units=metric&q=Leganes&appid=... { coord: { lon: -3.76, lat: 40.33 }, weather: [ { id: 300, main: "Drizzle", description: "few clouds", icon: "09d" } ], base: "cmc stations", main: { temp: 8.21, pressure: 1032, humidity: 87, temp_min: 8, temp_max: 8.6 },
  • 93. Json parser http://api.openweathermap.org/data/2.5/weather? units=metric&q=Leganes&appid=... wind: { speed: 2.1, deg: 350 }, clouds: { all: 75 }, dt: 1454061483, sys: { type: 1, id: 5488, message: 0.0046, country: "ES", sunrise: 1454052430, sunset: 1454088574 }, id: 3118594, name: "Leganes", cod: 200 } { coord: { lon: -3.76, lat: 40.33 }, weather: [ { id: 300, main: "Drizzle", description: "few clouds", icon: "09d" } ], base: "cmc stations", main: { temp: 8.21, pressure: 1032, humidity: 87, temp_min: 8, temp_max: 8.6 },
  • 94. Json parser import groovy.json.JsonSlurper def url = "http://api.openweathermap.org/data/2.5/weather? units=metric&q=Leganes&appid=...".toURL() def response = new JsonSlurper().parse(url) String weather = response.weather.collect { it.description }.join(', ') String country = response.sys.country String temp = response.main.temp String city = response.name println "Tiempo en ${city} (${country}): ${weather}. Temp: ${temp} ºC" // Tiempo en Leganes (ES): few clouds. Temp: 8.84 ºC { weather: [ { description: "few clouds", } ], main: { temp: 8.21 }, sys: { country: "ES", }, name: "Leganes", }
  • 95. Json parser import groovy.json.JsonSlurper def url = "http://api.openweathermap.org/data/2.5/weather? units=metric&q=Leganes&appid=...".toURL() def response = new JsonSlurper().parse(url) String weather = response.weather.collect { it.description }.join(', ') String country = response.sys.country String temp = response.main.temp String city = response.name println "Tiempo en ${city} (${country}): ${weather}. Temp: ${temp} ºC" // Tiempo en Leganes (ES): few clouds. Temp: 8.84 ºC { weather: [ { description: "few clouds", } ], main: { temp: 8.21 }, sys: { country: "ES", }, name: "Leganes", }
  • 96. Json parser import groovy.json.JsonSlurper def url = "http://api.openweathermap.org/data/2.5/weather? units=metric&q=Leganes&appid=...".toURL() def response = new JsonSlurper().parse(url) String weather = response.weather.collect { it.description }.join(', ') String country = response.sys.country String temp = response.main.temp String city = response.name println "Tiempo en ${city} (${country}): ${weather}. Temp: ${temp} ºC" // Tiempo en Leganes (ES): few clouds. Temp: 8.84 ºC { weather: [ { description: "few clouds", } ], main: { temp: 8.21 }, sys: { country: "ES", }, name: "Leganes", }
  • 97. Json parser import groovy.json.JsonSlurper def url = "http://api.openweathermap.org/data/2.5/weather? units=metric&q=Leganes&appid=...".toURL() def response = new JsonSlurper().parse(url) String weather = response.weather.collect { it.description }.join(', ') String country = response.sys.country String temp = response.main.temp String city = response.name println "Tiempo en ${city} (${country}): ${weather}. Temp: ${temp} ºC" // Tiempo en Leganes (ES): few clouds. Temp: 8.21 ºC { weather: [ { description: "few clouds", } ], main: { temp: 8.21 }, sys: { country: "ES", }, name: "Leganes", }
  • 98. Lectura de fichero de texto static String readFile(File file) throws IOException { byte[] bytes = Files.readAllBytes(file.toPath()); return new String(bytes, "UTF-8"); } public static void main(String[] args) { File file = new File("foo.txt"); try { String content = readFile(file); System.out.println(content); } catch (IOException e) { e.printStackTrace(); } }
  • 99. Lectura de fichero de texto static String readFile(File file) throws IOException { byte[] bytes = Files.readAllBytes(file.toPath()); return new String(bytes, "UTF-8"); } public static void main(String[] args) { File file = new File("foo.txt"); try { String content = readFile(file); System.out.println(content); } catch (IOException e) { e.printStackTrace(); } } String content = new File('foo.txt').text
  • 100. Lectura de fichero de texto static String readFile(File file) throws IOException { byte[] bytes = Files.readAllBytes(file.toPath()); return new String(bytes, "UTF-8"); } public static void main(String[] args) { File file = new File("foo.txt"); try { String content = readFile(file); System.out.println(content); } catch (IOException e) { e.printStackTrace(); } } String content = new File('foo.txt').text
  • 101. Lectura de una URL import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; public class GetURLContent { public static void main(String[] args) { try { URL url = new URL("http://www.google.com"); URLConnection conn = url.openConnection(); BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; while ((inputLine = br.readLine()) != null) { System.out.println(inputLine); } br.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
  • 102. Lectura de una URL import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; public class GetURLContent { public static void main(String[] args) { try { URL url = new URL("http://www.google.com"); URLConnection conn = url.openConnection(); BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; while ((inputLine = br.readLine()) != null) { System.out.println(inputLine); } br.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } println 'http://www.google.com'.toURL().text
  • 103. Lectura de una URL import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; public class GetURLContent { public static void main(String[] args) { try { URL url = new URL("http://www.google.com"); URLConnection conn = url.openConnection(); BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; while ((inputLine = br.readLine()) != null) { System.out.println(inputLine); } br.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } println 'http://www.google.com'.toURL().text
  • 104. ➢ Groovy JDK ➢ Amplía tipos ➢ Añade métodos ➢ http://www.groovy-lang.org/gdk.html GDK
  • 106. DSLs: Domain Specific Languages def mailer = new Mailer() mailer.setTo('admin@example.com', 'user@example.com') mailer.setSubject('Urgente!') mailer.setBody('Bla, bla, bla') mailer.setHeaders(spam: 'no', important: true)
  • 107. DSLs: Domain Specific Languages def mailer = new Mailer() mailer.setTo('admin@example.com', 'user@example.com') mailer.setSubject('Urgente!') mailer.setBody('Bla, bla, bla') mailer.setHeaders(spam: 'no', important: true) def mailer = new Mailer() .setTo('admin@example.com', 'user@example.com') .setSubject('Urgente!') .setBody('Bla, bla, bla') .setHeaders(spam: 'no', important: true)
  • 108. DSLs: Domain Specific Languages mail { to 'admin@example.com', 'user@example.com' subject 'Urgente!' body 'Bla, bla, bla' headers spam: 'no', important: true } class MailComposer { void to(String... addresses) { println "to: $addresses"} void subject(String subject) { println "subject: $subject" } void body(String body) { println "body: $body" } void headers(Map headers) { println "headers: $headers" } } void mail(@DelegatesTo(MailComposer) Closure composer) { // Igual que: // new MailComposer().with(composer) Closure cl = composer.clone() cl.delegate = new MailComposer() cl.resolveStrategy = Closure.DELEGATE_FIRST cl() }
  • 109. DSLs: Domain Specific Languages mail { to 'admin@example.com', 'user@example.com' subject 'Urgente!' body 'Bla, bla, bla' headers spam: 'no', important: true } class MailComposer { void to(String... addresses) { println "to: $addresses"} void subject(String subject) { println "subject: $subject" } void body(String body) { println "body: $body" } void headers(Map headers) { println "headers: $headers" } } void mail(@DelegatesTo(MailComposer) Closure composer) { // Igual que: // new MailComposer().with(composer) Closure cl = composer.clone() cl.delegate = new MailComposer() cl.resolveStrategy = Closure.DELEGATE_FIRST cl() }
  • 110. DSLs: Domain Specific Languages mail { to 'admin@example.com', 'user@example.com' subject 'Urgente!' body 'Bla, bla, bla' headers spam: 'no', important: true } class MailComposer { void to(String... addresses) { println "to: $addresses"} void subject(String subject) { println "subject: $subject" } void body(String body) { println "body: $body" } void headers(Map headers) { println "headers: $headers" } } void mail(@DelegatesTo(MailComposer) Closure composer) { // Igual que: // new MailComposer().with(composer) Closure cl = composer.clone() cl.delegate = new MailComposer() cl.resolveStrategy = Closure.DELEGATE_FIRST cl() }
  • 111. ➢ +50 trasformación out-of-the-box ➢ @ToString, @EqualsAndHashCode, @InheritConstructors, @Sortable, @Delegate, @Immutable, @CompileStatic,... Transformaciones AST
  • 112. @EqualsAndHashCode public class User extends java.lang.Object { private java.lang.String name private java.lang.Integer age public int hashCode() { java.lang.Object _result = org.codehaus.groovy.util.HashCodeHelper.initHash() if (!(this.getName().is(this))) { _result = org.codehaus.groovy.util.HashCodeHelper.updateHash(_result, this.getName()) } if (!(this.getAge().is(this))) { _result = org.codehaus.groovy.util.HashCodeHelper.updateHash(_result, this.getAge()) } return _result } public boolean canEqual(java.lang.Object other) { return other instanceof User } public boolean equals(java.lang.Object other) { if ( other == null) { return false } if (this.is(other)) { return true } if (!( other instanceof User)) { return false } User otherTyped = (( other ) as User) if (!(otherTyped.canEqual( this ))) { return false } if (!(this.getName() == otherTyped.getName())) { return false } if (!(this.getAge() == otherTyped.getAge())) { return false } return true } }