SlideShare una empresa de Scribd logo
De Java a Groovy:De Java a Groovy:
¡Hora de Aventuras!¡Hora de Aventuras!
Iván López - @ilopmarIván López - @ilopmar
➢ Iván López @ilopmar
➢ Desarrollador Groovy & Grails
Miembro del equipo de Grails
en OCI
➢ Coordinador de @madridgug
http://madridgug.com
➢ Organizador de Greach
@greachconf
http://greachconf.com
➢ Speaker: SpringOne 2GX, GR8Conf,
G3 Summit, Codemotion, GeeCon, JavaCro,
Spring IO, Greach, ConFoo, RigaDevDays,...
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: 37)
assert p.nombre == 'Iván'
p.edad = 38
assert p.edad == 38
Constructor Builder
import groovy.transform.builder.Builder
@Builder
class Persona {
String nombre
int edad
}
Persona.builder()
.nombre('Iván')
.edad(37)
.build()
Strings y GString
def nombre = 'Iván'
def edad = 37
println "¡Hola ${nombre}, tienes ${edad} años!"
// ¡Hola Iván, tienes 37 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 = 37
println "¡Hola ${nombre}, tienes ${edad} años!"
// ¡Hola Iván, tienes 37 años!
def query = """
insert into people
(firstName, age)
values (${nombre}, ${edad})
"""
new Sql(datasource).execute query
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);
Listas
def list = ['a', 'b', 'c'] // ArrayList
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'] // ArrayList
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'] // ArrayList
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: 37] // HashMap
assert map.nombre == 'Iván'
assert map.get('nombre') == 'Iván'
assert map['nombre'] == 'Iván'
map.hijas = ['Judith', 'Adriana']
assert map['hijas'].contains('Adriana')
Mapas
def map = [nombre: 'Iván', edad: 37] // HashMap
assert map.nombre == 'Iván'
assert map.get('nombre') == 'Iván'
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
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 = [
name: 'Iván', age: 37,
childs: [
[name: 'Judith', age: 10], [name: 'Adriana', age: 7]
]
]
assert info.childs.name.first() == 'Adriana'
info.childs.name.first() == 'Adriana'
| | | | |
| | | Judith false
| | | 6 differences (14% similarity)
| | | (Ju)d(-)i(th-)
| | | (A-)d(r)i(ana)
| | [Judith, Adriana]
| [[name:Judith, age:10], [name:Adriana, age:7]]
[name:Iván, age:37, childs:[[name:Judith, age:10], [name:Adriana,
age:7]]]
Power asserts
def info = [
name: 'Iván', age: 37,
childs: [
[name: 'Judith', age: 10], [name: 'Adriana', age: 7]
]
]
assert info.childs.name.first() == 'Adriana'
info.childs.name.first() == 'Adriana'
| | | | |
| | | Judith false
| | | 6 differences (14% similarity)
| | | (Ju)d(-)i(th-)
| | | (A-)d(r)i(ana)
| | [Judith, Adriana]
| [[name:Judith, age:10], [name:Adriana, age:7]]
[name:Iván, age:37, childs:[[name:Judith, age:10], [name:Adriana,
age:7]]]
Power asserts
def info = [
name: 'Iván', age: 37,
childs: [
[name: 'Judith', age: 10], [name: 'Adriana', age: 7]
]
]
assert info.childs.name.first() == 'Adriana'
info.childs.name.first() == 'Adriana'
| | | | |
| | | Judith false
| | | 6 differences (14% similarity)
| | | (Ju)d(-)i(th-)
| | | (A-)d(r)i(ana)
| | [Judith, Adriana]
| [[name:Judith, age:10], [name:Adriana, age:7]]
[name:Iván, age:37, childs:[[name:Judith, age:10], [name:Adriana,
age:7]]]
Power asserts
def info = [
name: 'Iván', age: 37,
childs: [
[name: 'Judith', age: 10], [name: 'Adriana', age: 7]
]
]
assert info.childs.name.first() == 'Adriana'
info.childs.name.first() == 'Adriana'
| | | | |
| | | Judith false
| | | 6 differences (14% similarity)
| | | (Ju)d(-)i(th-)
| | | (A-)d(r)i(ana)
| | [Judith, Adriana]
| [[name:Judith, age:10], [name:Adriana, age:7]]
[name:Iván, age:37, childs:[[name:Judith, age:10], [name:Adriana,
age:7]]]
Power asserts
def info = [
name: 'Iván', age: 37,
childs: [
[name: 'Judith', age: 10], [name: 'Adriana', age: 7]
]
]
assert info.childs.name.first() == 'Adriana'
info.childs.name.first() == 'Adriana'
| | | | |
| | | Judith false
| | | 6 differences (14% similarity)
| | | (Ju)d(-)i(th-)
| | | (A-)d(r)i(ana)
| | [Judith, Adriana]
| [[name:Judith, age:10], [name:Adriana, age:7]]
[name:Iván, age:37, childs:[[name:Judith, age:10], [name:Adriana,
age:7]]]
def info = [
name: 'Iván', age: 37,
childs: [
[name: 'Judith', age: 10], [name: 'Adriana', age: 7]
]
]
assert info.childs.name.first() == 'Adriana'
info.childs.name.first() == 'Adriana'
| | | | |
| | | Judith false
| | | 6 differences (14% similarity)
| | | (Ju)d(-)i(th-)
| | | (A-)d(r)i(ana)
| | [Judith, Adriana]
| [[name:Judith, age:10], [name:Adriana, age:7]]
[name:Iván, age:37, childs:[[name:Judith, age:10], [name:Adriana,
age:7]]]
Power asserts
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 )
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
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)
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::new)
Groovy Closures y Java 8 Lambdas
Json builder
{
"speaker": {
"firstName": "Iván",
"lastName": "López",
"address": {
"city": "Madrid",
"country": "España",
"zip": 28001
},
"conferences": [
"Greach",
"GR8Conf",
"G3 Summit"
]
}
}
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
import groovy.json.JsonBuilder
def builder = new JsonBuilder()
builder.
speaker {
firstName 'Iván'
lastName 'López'
address(
city: 'Madrid',
country: 'España',
zip: 28001,
)
conferences(
'Greach',
'GR8Conf',
'G3 Summit'
)
}
println builder.toPrettyString()
{
"speaker": {
"firstName": "Iván",
"lastName": "López",
"address": {
"city": "Madrid",
"country": "España",
"zip": 28001
},
"conferences": [
"Greach",
"GR8Conf",
"G3 Summit"
]
}
}
Parsear XML y Json en Java
Json parser
wind: {
speed: 3.1,
deg: 240
},
clouds: {
all: 40
},
dt: 1504427400,
sys: {
message: 0.0201,
country: "ES",
sunrise: 1504416809,
sunset: 1504463284
},
id: 2521978,
name: "Alicante",
cod: 200
}
http://api.openweathermap.org/data/2.5/weather?
units=metric&q=Alicante&appid=...
{
coord: {
lon: -0.48,
lat: 38.35
},
weather: [
{
id: 802,
main: "Clouds",
description: "scattered clouds",
icon: "03d"
}
],
base: "stations",
main: {
temp: 25,
pressure: 1017,
humidity: 69,
temp_min: 25,
temp_max: 25
},
Json parser
{
coord: {
lon: -0.48,
lat: 38.35
},
weather: [
{
id: 802,
main: "Clouds",
description: "scattered clouds",
icon: "03d"
}
],
base: "stations",
main: {
temp: 25,
pressure: 1017,
humidity: 69,
temp_min: 25,
temp_max: 25
},
wind: {
speed: 3.1,
deg: 240
},
clouds: {
all: 40
},
dt: 1504427400,
sys: {
message: 0.0201,
country: "ES",
sunrise: 1504416809,
sunset: 1504463284
},
id: 2521978,
name: "Alicante",
cod: 200
}
http://api.openweathermap.org/data/2.5/weather?
units=metric&q=Alicante&appid=...
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: "scattered clouds",
}
],
main: {
temp: 25
},
sys: {
country: "ES",
},
name: "Alicante",
}
Json parser
import groovy.json.JsonSlurper
URL url = "http://api.openweathermap.org/data/2.5/weather?
units=metric&q=Alicante&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 Alicante (ES): scattered clouds. Temp: 25 ºC
{
weather: [
{
description: "scattered clouds",
}
],
main: {
temp: 25
},
sys: {
country: "ES",
},
name: "Alicante",
}
Json parser
import groovy.json.JsonSlurper
URL url = "http://api.openweathermap.org/data/2.5/weather?
units=metric&q=Alicante&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 Alicante (ES): scattered clouds. Temp: 25 ºC
{
weather: [
{
description: "scattered clouds",
}
],
main: {
temp: 25
},
sys: {
country: "ES",
},
name: "Alicante",
}
Json parser
import groovy.json.JsonSlurper
URL url = "http://api.openweathermap.org/data/2.5/weather?
units=metric&q=Alicante&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 Alicante (ES): scattered clouds. Temp: 25 ºC
{
weather: [
{
description: "scattered clouds",
}
],
main: {
temp: 25
},
sys: {
country: "ES",
},
name: "Alicante",
}
Json parser
import groovy.json.JsonSlurper
URL url = "http://api.openweathermap.org/data/2.5/weather?
units=metric&q=Alicante&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 Alicante (ES): scattered clouds. Temp: 25 ºC
{
weather: [
{
description: "scattered clouds",
}
],
main: {
temp: 25
},
sys: {
country: "ES",
},
name: "Alicante",
}
Json parser
import groovy.json.JsonSlurper
URL url = "http://api.openweathermap.org/data/2.5/weather?
units=metric&q=Alicante&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 Alicante (ES): scattered clouds. Temp: 25 ºC
{
weather: [
{
description: "scattered clouds",
}
],
main: {
temp: 25
},
sys: {
country: "ES",
},
name: "Alicante",
}
Json parser
import groovy.json.JsonSlurper
URL url = "http://api.openweathermap.org/data/2.5/weather?
units=metric&q=Alicante&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 Alicante (ES): scattered clouds. Temp: 25 ºC
{
weather: [
{
description: "scattered clouds",
}
],
main: {
temp: 25
},
sys: {
country: "ES",
},
name: "Alicante",
}
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();
}
}
println 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();
}
}
println 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)
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
(
(
(
(
(
)
)
)
)
)
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!
¿Preguntas?
@ilopmar
lopez.ivan@gmail.com
https://github.com/ilopmar
Iván López

Más contenido relacionado

La actualidad más candente

WebRTC en tu web con OpenVidu
WebRTC en tu web con OpenViduWebRTC en tu web con OpenVidu
WebRTC en tu web con OpenViduMicael Gallego
 
Conoce lo nuevo en RAD Studio, C++ Builder y Delphi 10.2.2
Conoce lo nuevo en RAD Studio, C++ Builder y Delphi 10.2.2Conoce lo nuevo en RAD Studio, C++ Builder y Delphi 10.2.2
Conoce lo nuevo en RAD Studio, C++ Builder y Delphi 10.2.2Fernando Rizzato
 
Curso Angular 9 - CodeURJC - Marzo 2020
Curso Angular 9 - CodeURJC - Marzo 2020Curso Angular 9 - CodeURJC - Marzo 2020
Curso Angular 9 - CodeURJC - Marzo 2020Micael Gallego
 
Desarrollo en 4G(Groovy, Grails, Git, GoogleAppEngine)
Desarrollo en 4G(Groovy, Grails, Git, GoogleAppEngine)Desarrollo en 4G(Groovy, Grails, Git, GoogleAppEngine)
Desarrollo en 4G(Groovy, Grails, Git, GoogleAppEngine)Jose Juan R. Zuñiga
 
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...Micael Gallego
 
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
 
Software libre para videoconferencias
Software libre para videoconferenciasSoftware libre para videoconferencias
Software libre para videoconferenciasMicael Gallego
 
Introducción a gvNIX y Spring Roo
Introducción a gvNIX y Spring RooIntroducción a gvNIX y Spring Roo
Introducción a gvNIX y Spring RooDISID
 
¿Cómo poner software de calidad en manos del usuario de forma rápida?
¿Cómo poner software de calidad en manos del usuario de forma rápida?¿Cómo poner software de calidad en manos del usuario de forma rápida?
¿Cómo poner software de calidad en manos del usuario de forma rápida?Micael Gallego
 
Zinjai como entorno de programación
Zinjai como entorno de programación Zinjai como entorno de programación
Zinjai como entorno de programación Leonela Yuquilema
 
Java completo y agragado
Java completo y agragadoJava completo y agragado
Java completo y agragadoMaria
 
Desarrollo de pruebas en entornos Java EE
Desarrollo de pruebas en entornos Java EEDesarrollo de pruebas en entornos Java EE
Desarrollo de pruebas en entornos Java EEJosé Manuel López
 
My programming language 04 05-2014
My programming language 04 05-2014My programming language 04 05-2014
My programming language 04 05-2014Neptuno Networks
 
OpenVidu Commitconf 2018
OpenVidu Commitconf 2018 OpenVidu Commitconf 2018
OpenVidu Commitconf 2018 Micael Gallego
 

La actualidad más candente (20)

Gwt I - entendiendo gwt
Gwt I - entendiendo gwtGwt I - entendiendo gwt
Gwt I - entendiendo gwt
 
WebRTC en tu web con OpenVidu
WebRTC en tu web con OpenViduWebRTC en tu web con OpenVidu
WebRTC en tu web con OpenVidu
 
Conoce lo nuevo en RAD Studio, C++ Builder y Delphi 10.2.2
Conoce lo nuevo en RAD Studio, C++ Builder y Delphi 10.2.2Conoce lo nuevo en RAD Studio, C++ Builder y Delphi 10.2.2
Conoce lo nuevo en RAD Studio, C++ Builder y Delphi 10.2.2
 
Curso Angular 9 - CodeURJC - Marzo 2020
Curso Angular 9 - CodeURJC - Marzo 2020Curso Angular 9 - CodeURJC - Marzo 2020
Curso Angular 9 - CodeURJC - Marzo 2020
 
Desarrollo en 4G(Groovy, Grails, Git, GoogleAppEngine)
Desarrollo en 4G(Groovy, Grails, Git, GoogleAppEngine)Desarrollo en 4G(Groovy, Grails, Git, GoogleAppEngine)
Desarrollo en 4G(Groovy, Grails, Git, GoogleAppEngine)
 
Creación de Plataformas
Creación de PlataformasCreación de Plataformas
Creación de Plataformas
 
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
 
Pres1
Pres1Pres1
Pres1
 
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
 
RIA con JavaFX
RIA con JavaFXRIA con JavaFX
RIA con JavaFX
 
Intro a Grails @ ITESCA
Intro a Grails @ ITESCAIntro a Grails @ ITESCA
Intro a Grails @ ITESCA
 
Software libre para videoconferencias
Software libre para videoconferenciasSoftware libre para videoconferencias
Software libre para videoconferencias
 
Introducción a gvNIX y Spring Roo
Introducción a gvNIX y Spring RooIntroducción a gvNIX y Spring Roo
Introducción a gvNIX y Spring Roo
 
¿Cómo poner software de calidad en manos del usuario de forma rápida?
¿Cómo poner software de calidad en manos del usuario de forma rápida?¿Cómo poner software de calidad en manos del usuario de forma rápida?
¿Cómo poner software de calidad en manos del usuario de forma rápida?
 
Zinjai como entorno de programación
Zinjai como entorno de programación Zinjai como entorno de programación
Zinjai como entorno de programación
 
Java completo y agragado
Java completo y agragadoJava completo y agragado
Java completo y agragado
 
Introducción a Java FX
Introducción a Java FXIntroducción a Java FX
Introducción a Java FX
 
Desarrollo de pruebas en entornos Java EE
Desarrollo de pruebas en entornos Java EEDesarrollo de pruebas en entornos Java EE
Desarrollo de pruebas en entornos Java EE
 
My programming language 04 05-2014
My programming language 04 05-2014My programming language 04 05-2014
My programming language 04 05-2014
 
OpenVidu Commitconf 2018
OpenVidu Commitconf 2018 OpenVidu Commitconf 2018
OpenVidu Commitconf 2018
 

Similar a Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!

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
 
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
 
Tecnologia web
Tecnologia webTecnologia web
Tecnologia webfanyto
 
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
 
Vaadin y Grails Barcamp 2013
Vaadin y Grails Barcamp 2013Vaadin y Grails Barcamp 2013
Vaadin y Grails Barcamp 2013Carlos Camacho
 
GraalVM - MálagaJUG 2018-11-29
GraalVM - MálagaJUG 2018-11-29GraalVM - MálagaJUG 2018-11-29
GraalVM - MálagaJUG 2018-11-29Jorge Hidalgo
 
Java completo y agragado
Java completo y agragadoJava completo y agragado
Java completo y agragadoMaria
 
Hack x crack_java
Hack x crack_javaHack x crack_java
Hack x crack_javaSaviotec
 
¿Cómo elegir el languaje y el framework de tu próxima aplicación web?
¿Cómo elegir el languaje y el framework de tu próxima aplicación web?¿Cómo elegir el languaje y el framework de tu próxima aplicación web?
¿Cómo elegir el languaje y el framework de tu próxima aplicación web?Antonio Ognio
 
Universidad nacional de chimborazo
Universidad nacional de chimborazoUniversidad nacional de chimborazo
Universidad nacional de chimborazoJesica Pérez
 

Similar a Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras! (20)

Cuestionario
CuestionarioCuestionario
Cuestionario
 
grails.org.mx Primera Reunion
grails.org.mx Primera Reuniongrails.org.mx Primera Reunion
grails.org.mx Primera Reunion
 
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
 
Introduccion a Groovy
Introduccion a GroovyIntroduccion a Groovy
Introduccion a Groovy
 
Java script
Java scriptJava script
Java script
 
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
 
Java poliglota
Java poliglotaJava poliglota
Java poliglota
 
Tecnologia web
Tecnologia webTecnologia web
Tecnologia web
 
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
 
Vaadin y Grails Barcamp 2013
Vaadin y Grails Barcamp 2013Vaadin y Grails Barcamp 2013
Vaadin y Grails Barcamp 2013
 
GraalVM - MálagaJUG 2018-11-29
GraalVM - MálagaJUG 2018-11-29GraalVM - MálagaJUG 2018-11-29
GraalVM - MálagaJUG 2018-11-29
 
Aprendiendo GWT
Aprendiendo GWTAprendiendo GWT
Aprendiendo GWT
 
Java completo y agragado
Java completo y agragadoJava completo y agragado
Java completo y agragado
 
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
 
¿Cómo elegir el languaje y el framework de tu próxima aplicación web?
¿Cómo elegir el languaje y el framework de tu próxima aplicación web?¿Cómo elegir el languaje y el framework de tu próxima aplicación web?
¿Cómo elegir el languaje y el framework de tu próxima aplicación web?
 
Universidad nacional de chimborazo
Universidad nacional de chimborazoUniversidad nacional de chimborazo
Universidad nacional de chimborazo
 

Más de Iván López Martín

SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersIvá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
 

Más de Iván López Martín (20)

SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
 
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
 

Último

Inteligencia Artificial para usuarios nivel inicial
Inteligencia Artificial para usuarios nivel inicialInteligencia Artificial para usuarios nivel inicial
Inteligencia Artificial para usuarios nivel inicialEducática
 
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptxleidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptxLeidyfuentes19
 
proyectos_social_y_socioproductivos _mapas_conceptuales
proyectos_social_y_socioproductivos _mapas_conceptualesproyectos_social_y_socioproductivos _mapas_conceptuales
proyectos_social_y_socioproductivos _mapas_conceptualesssuserbe0d1c
 
Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfEmilio Casbas
 
Herramientas informáticas. Sara Torres R.
Herramientas informáticas. Sara Torres R.Herramientas informáticas. Sara Torres R.
Herramientas informáticas. Sara Torres R.saravalentinat22
 
Licencias para el Uso y el Desarrollo de Software
Licencias para el Uso y el Desarrollo de SoftwareLicencias para el Uso y el Desarrollo de Software
Licencias para el Uso y el Desarrollo de SoftwareAndres Avila
 
HIGADO Y TRAUMA HEPATICO UDABOL 2024 (3).pdf
HIGADO  Y TRAUMA HEPATICO UDABOL 2024 (3).pdfHIGADO  Y TRAUMA HEPATICO UDABOL 2024 (3).pdf
HIGADO Y TRAUMA HEPATICO UDABOL 2024 (3).pdfIsabelHuairaGarma
 
EduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clasesEduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clasesPABLOCESARGARZONBENI
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informáticavazquezgarciajesusma
 
Diagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdfDiagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdfManuelCampos464987
 
Posnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativaPosnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativaFernando Villares
 
HerramientasInformaticas ¿Que es? - ¿Para que sirve? - Recomendaciones - Comp...
HerramientasInformaticas ¿Que es? - ¿Para que sirve? - Recomendaciones - Comp...HerramientasInformaticas ¿Que es? - ¿Para que sirve? - Recomendaciones - Comp...
HerramientasInformaticas ¿Que es? - ¿Para que sirve? - Recomendaciones - Comp...Kevin Serna
 
Gestión de concurrencia y bloqueos en SQL Server
Gestión de concurrencia y bloqueos en SQL ServerGestión de concurrencia y bloqueos en SQL Server
Gestión de concurrencia y bloqueos en SQL ServerRobertoCarrancioFern
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfcj3806354
 
herramientas informaticas mas utilizadas
herramientas informaticas mas utilizadasherramientas informaticas mas utilizadas
herramientas informaticas mas utilizadaspqeilyn0827
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informáticavazquezgarciajesusma
 
Sistemas distribuidos de redes de computadores en un entorno virtual de apren...
Sistemas distribuidos de redes de computadores en un entorno virtual de apren...Sistemas distribuidos de redes de computadores en un entorno virtual de apren...
Sistemas distribuidos de redes de computadores en un entorno virtual de apren...Luis Fernando Uribe Villamil
 
3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx
3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx
3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docxwerito139410
 
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024DanielErazoMedina
 
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Telefónica
 

Último (20)

Inteligencia Artificial para usuarios nivel inicial
Inteligencia Artificial para usuarios nivel inicialInteligencia Artificial para usuarios nivel inicial
Inteligencia Artificial para usuarios nivel inicial
 
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptxleidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
 
proyectos_social_y_socioproductivos _mapas_conceptuales
proyectos_social_y_socioproductivos _mapas_conceptualesproyectos_social_y_socioproductivos _mapas_conceptuales
proyectos_social_y_socioproductivos _mapas_conceptuales
 
Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdf
 
Herramientas informáticas. Sara Torres R.
Herramientas informáticas. Sara Torres R.Herramientas informáticas. Sara Torres R.
Herramientas informáticas. Sara Torres R.
 
Licencias para el Uso y el Desarrollo de Software
Licencias para el Uso y el Desarrollo de SoftwareLicencias para el Uso y el Desarrollo de Software
Licencias para el Uso y el Desarrollo de Software
 
HIGADO Y TRAUMA HEPATICO UDABOL 2024 (3).pdf
HIGADO  Y TRAUMA HEPATICO UDABOL 2024 (3).pdfHIGADO  Y TRAUMA HEPATICO UDABOL 2024 (3).pdf
HIGADO Y TRAUMA HEPATICO UDABOL 2024 (3).pdf
 
EduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clasesEduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clases
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
 
Diagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdfDiagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdf
 
Posnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativaPosnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativa
 
HerramientasInformaticas ¿Que es? - ¿Para que sirve? - Recomendaciones - Comp...
HerramientasInformaticas ¿Que es? - ¿Para que sirve? - Recomendaciones - Comp...HerramientasInformaticas ¿Que es? - ¿Para que sirve? - Recomendaciones - Comp...
HerramientasInformaticas ¿Que es? - ¿Para que sirve? - Recomendaciones - Comp...
 
Gestión de concurrencia y bloqueos en SQL Server
Gestión de concurrencia y bloqueos en SQL ServerGestión de concurrencia y bloqueos en SQL Server
Gestión de concurrencia y bloqueos en SQL Server
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
 
herramientas informaticas mas utilizadas
herramientas informaticas mas utilizadasherramientas informaticas mas utilizadas
herramientas informaticas mas utilizadas
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
 
Sistemas distribuidos de redes de computadores en un entorno virtual de apren...
Sistemas distribuidos de redes de computadores en un entorno virtual de apren...Sistemas distribuidos de redes de computadores en un entorno virtual de apren...
Sistemas distribuidos de redes de computadores en un entorno virtual de apren...
 
3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx
3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx
3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx
 
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
 
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
 

Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!

  • 1. De Java a Groovy:De Java a Groovy: ¡Hora de Aventuras!¡Hora de Aventuras! Iván López - @ilopmarIván López - @ilopmar
  • 2. ➢ Iván López @ilopmar ➢ Desarrollador Groovy & Grails Miembro del equipo de Grails en OCI ➢ Coordinador de @madridgug http://madridgug.com ➢ Organizador de Greach @greachconf http://greachconf.com ➢ Speaker: SpringOne 2GX, GR8Conf, G3 Summit, Codemotion, GeeCon, JavaCro, Spring IO, Greach, ConFoo, RigaDevDays,... 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: 37) assert p.nombre == 'Iván' p.edad = 38 assert p.edad == 38
  • 44. Constructor Builder import groovy.transform.builder.Builder @Builder class Persona { String nombre int edad } Persona.builder() .nombre('Iván') .edad(37) .build()
  • 45. Strings y GString def nombre = 'Iván' def edad = 37 println "¡Hola ${nombre}, tienes ${edad} años!" // ¡Hola Iván, tienes 37 años! def query = """ insert into people (firstName, age) values (${nombre}, ${edad}) """ new Sql(datasource).execute query
  • 46. Strings y GString def nombre = 'Iván' def edad = 37 println "¡Hola ${nombre}, tienes ${edad} años!" // ¡Hola Iván, tienes 37 años! def query = """ insert into people (firstName, age) values (${nombre}, ${edad}) """ new Sql(datasource).execute query
  • 47. Números que... System.out.println(2.00 - 1.1); // 0.8999999999999999
  • 48. Números que... System.out.println(2.00 - 1.1); // 0.8999999999999999
  • 51. ¡BigDecimal por defecto! assert 2.0 - 1.1 == 0.9 assert 3 / 2 == 1.5
  • 52. Equals y == estado != null && estado.equals(Estado.COMPLETADO);
  • 53. Equals y == estado == Estado.COMPLETADO estado != null && estado.equals(Estado.COMPLETADO);
  • 54. Listas def list = ['a', 'b', 'c'] // ArrayList 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'] // ArrayList 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'] // ArrayList 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: 37] // HashMap assert map.nombre == 'Iván' assert map.get('nombre') == 'Iván' assert map['nombre'] == 'Iván' map.hijas = ['Judith', 'Adriana'] assert map['hijas'].contains('Adriana')
  • 58. Mapas def map = [nombre: 'Iván', edad: 37] // HashMap assert map.nombre == 'Iván' assert map.get('nombre') == 'Iván' 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. Power asserts assert (2 + 7) * 5 != (2 * 5) + (7 * 5) (2 + 7) * 5 != (2 * 5) + (7 * 5) | | | | | | 9 45 false 10 45 35
  • 63. Power asserts assert (2 + 7) * 5 != (2 * 5) + (7 * 5) (2 + 7) * 5 != (2 * 5) + (7 * 5) | | | | | | 9 45 false 10 45 35
  • 64. Power asserts def info = [ name: 'Iván', age: 37, childs: [ [name: 'Judith', age: 10], [name: 'Adriana', age: 7] ] ] assert info.childs.name.first() == 'Adriana' info.childs.name.first() == 'Adriana' | | | | | | | | Judith false | | | 6 differences (14% similarity) | | | (Ju)d(-)i(th-) | | | (A-)d(r)i(ana) | | [Judith, Adriana] | [[name:Judith, age:10], [name:Adriana, age:7]] [name:Iván, age:37, childs:[[name:Judith, age:10], [name:Adriana, age:7]]]
  • 65. Power asserts def info = [ name: 'Iván', age: 37, childs: [ [name: 'Judith', age: 10], [name: 'Adriana', age: 7] ] ] assert info.childs.name.first() == 'Adriana' info.childs.name.first() == 'Adriana' | | | | | | | | Judith false | | | 6 differences (14% similarity) | | | (Ju)d(-)i(th-) | | | (A-)d(r)i(ana) | | [Judith, Adriana] | [[name:Judith, age:10], [name:Adriana, age:7]] [name:Iván, age:37, childs:[[name:Judith, age:10], [name:Adriana, age:7]]]
  • 66. Power asserts def info = [ name: 'Iván', age: 37, childs: [ [name: 'Judith', age: 10], [name: 'Adriana', age: 7] ] ] assert info.childs.name.first() == 'Adriana' info.childs.name.first() == 'Adriana' | | | | | | | | Judith false | | | 6 differences (14% similarity) | | | (Ju)d(-)i(th-) | | | (A-)d(r)i(ana) | | [Judith, Adriana] | [[name:Judith, age:10], [name:Adriana, age:7]] [name:Iván, age:37, childs:[[name:Judith, age:10], [name:Adriana, age:7]]]
  • 67. Power asserts def info = [ name: 'Iván', age: 37, childs: [ [name: 'Judith', age: 10], [name: 'Adriana', age: 7] ] ] assert info.childs.name.first() == 'Adriana' info.childs.name.first() == 'Adriana' | | | | | | | | Judith false | | | 6 differences (14% similarity) | | | (Ju)d(-)i(th-) | | | (A-)d(r)i(ana) | | [Judith, Adriana] | [[name:Judith, age:10], [name:Adriana, age:7]] [name:Iván, age:37, childs:[[name:Judith, age:10], [name:Adriana, age:7]]]
  • 68. Power asserts def info = [ name: 'Iván', age: 37, childs: [ [name: 'Judith', age: 10], [name: 'Adriana', age: 7] ] ] assert info.childs.name.first() == 'Adriana' info.childs.name.first() == 'Adriana' | | | | | | | | Judith false | | | 6 differences (14% similarity) | | | (Ju)d(-)i(th-) | | | (A-)d(r)i(ana) | | [Judith, Adriana] | [[name:Judith, age:10], [name:Adriana, age:7]] [name:Iván, age:37, childs:[[name:Judith, age:10], [name:Adriana, age:7]]]
  • 69. def info = [ name: 'Iván', age: 37, childs: [ [name: 'Judith', age: 10], [name: 'Adriana', age: 7] ] ] assert info.childs.name.first() == 'Adriana' info.childs.name.first() == 'Adriana' | | | | | | | | Judith false | | | 6 differences (14% similarity) | | | (Ju)d(-)i(th-) | | | (A-)d(r)i(ana) | | [Judith, Adriana] | [[name:Judith, age:10], [name:Adriana, age:7]] [name:Iván, age:37, childs:[[name:Judith, age:10], [name:Adriana, age:7]]] Power asserts
  • 70. Groovy truth assert !( null ) assert !( "" ) assert !( '' ) assert !( [] ) assert !( [:] ) assert !( 0 )
  • 71. Groovy truth false assert !( null ) assert !( "" ) assert !( '' ) assert !( [] ) assert !( [:] ) assert !( 0 )
  • 72. 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 )
  • 73. 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 )
  • 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. 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); } }
  • 83. 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)
  • 84. 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::new) Groovy Closures y Java 8 Lambdas
  • 85. Json builder { "speaker": { "firstName": "Iván", "lastName": "López", "address": { "city": "Madrid", "country": "España", "zip": 28001 }, "conferences": [ "Greach", "GR8Conf", "G3 Summit" ] } } 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()
  • 86. Json builder import groovy.json.JsonBuilder def builder = new JsonBuilder() builder. speaker { firstName 'Iván' lastName 'López' address( city: 'Madrid', country: 'España', zip: 28001, ) conferences( 'Greach', 'GR8Conf', 'G3 Summit' ) } println builder.toPrettyString() { "speaker": { "firstName": "Iván", "lastName": "López", "address": { "city": "Madrid", "country": "España", "zip": 28001 }, "conferences": [ "Greach", "GR8Conf", "G3 Summit" ] } }
  • 87. Parsear XML y Json en Java
  • 88. Json parser wind: { speed: 3.1, deg: 240 }, clouds: { all: 40 }, dt: 1504427400, sys: { message: 0.0201, country: "ES", sunrise: 1504416809, sunset: 1504463284 }, id: 2521978, name: "Alicante", cod: 200 } http://api.openweathermap.org/data/2.5/weather? units=metric&q=Alicante&appid=... { coord: { lon: -0.48, lat: 38.35 }, weather: [ { id: 802, main: "Clouds", description: "scattered clouds", icon: "03d" } ], base: "stations", main: { temp: 25, pressure: 1017, humidity: 69, temp_min: 25, temp_max: 25 },
  • 89. Json parser { coord: { lon: -0.48, lat: 38.35 }, weather: [ { id: 802, main: "Clouds", description: "scattered clouds", icon: "03d" } ], base: "stations", main: { temp: 25, pressure: 1017, humidity: 69, temp_min: 25, temp_max: 25 }, wind: { speed: 3.1, deg: 240 }, clouds: { all: 40 }, dt: 1504427400, sys: { message: 0.0201, country: "ES", sunrise: 1504416809, sunset: 1504463284 }, id: 2521978, name: "Alicante", cod: 200 } http://api.openweathermap.org/data/2.5/weather? units=metric&q=Alicante&appid=...
  • 90. 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: "scattered clouds", } ], main: { temp: 25 }, sys: { country: "ES", }, name: "Alicante", }
  • 91. Json parser import groovy.json.JsonSlurper URL url = "http://api.openweathermap.org/data/2.5/weather? units=metric&q=Alicante&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 Alicante (ES): scattered clouds. Temp: 25 ºC { weather: [ { description: "scattered clouds", } ], main: { temp: 25 }, sys: { country: "ES", }, name: "Alicante", }
  • 92. Json parser import groovy.json.JsonSlurper URL url = "http://api.openweathermap.org/data/2.5/weather? units=metric&q=Alicante&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 Alicante (ES): scattered clouds. Temp: 25 ºC { weather: [ { description: "scattered clouds", } ], main: { temp: 25 }, sys: { country: "ES", }, name: "Alicante", }
  • 93. Json parser import groovy.json.JsonSlurper URL url = "http://api.openweathermap.org/data/2.5/weather? units=metric&q=Alicante&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 Alicante (ES): scattered clouds. Temp: 25 ºC { weather: [ { description: "scattered clouds", } ], main: { temp: 25 }, sys: { country: "ES", }, name: "Alicante", }
  • 94. Json parser import groovy.json.JsonSlurper URL url = "http://api.openweathermap.org/data/2.5/weather? units=metric&q=Alicante&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 Alicante (ES): scattered clouds. Temp: 25 ºC { weather: [ { description: "scattered clouds", } ], main: { temp: 25 }, sys: { country: "ES", }, name: "Alicante", }
  • 95. Json parser import groovy.json.JsonSlurper URL url = "http://api.openweathermap.org/data/2.5/weather? units=metric&q=Alicante&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 Alicante (ES): scattered clouds. Temp: 25 ºC { weather: [ { description: "scattered clouds", } ], main: { temp: 25 }, sys: { country: "ES", }, name: "Alicante", }
  • 96. Json parser import groovy.json.JsonSlurper URL url = "http://api.openweathermap.org/data/2.5/weather? units=metric&q=Alicante&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 Alicante (ES): scattered clouds. Temp: 25 ºC { weather: [ { description: "scattered clouds", } ], main: { temp: 25 }, sys: { country: "ES", }, name: "Alicante", }
  • 97. 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(); } }
  • 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(); } } println new File('foo.txt').text
  • 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(); } } println new File('foo.txt').text
  • 100. 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(); } } }
  • 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(); } } } println 'http://www.google.com'.toURL().text
  • 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. ➢ Groovy JDK ➢ Amplía tipos ➢ Añade métodos ➢ http://www.groovy-lang.org/gdk.html GDK
  • 105. 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)
  • 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) def mailer = new Mailer() .setTo('admin@example.com', 'user@example.com') .setSubject('Urgente!') .setBody('Bla, bla, bla') .setHeaders(spam: 'no', important: true)
  • 107. 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 ( ( ( ( ( ) ) ) ) )
  • 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. ➢ +50 trasformación out-of-the-box ➢ @ToString, @EqualsAndHashCode, @InheritConstructors, @Sortable, @Delegate, @Immutable, @CompileStatic,... Transformaciones AST
  • 111. @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 } }
  • 113.