SlideShare une entreprise Scribd logo
1  sur  74
Télécharger pour lire hors ligne
Groovy Goodness
PABLO ALBA CHAO
#708090
Porque Groovy no es Java sin puntos y comas
Ego-slide
Pablo Alba
CTO en Kaleidos Open Source
http://kaleidos.net/708090/
http://albaontech.wordpress.com
@_pabloalba_
Episode I
Corrían los 90...
Corrían los 90...
Corrían los 90...
Corrían los 90...
Corrían los 90...
Corrían los 90...
BufferedReader br = new BufferedReader( new FileReader("file.txt"));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
String everything = sb.toString();
} finally {
br.close();
}
Corrían los 90...
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
public class Main {
public static void main(String[] args) {
try {
URL google = new URL("http://www.google.com/");
BufferedReader in = new BufferedReader(newInputStreamReader(google.openStream()));
String inputLine;
while ((inputLine = in.readLine()) !=null)
System.out.println(inputLine);
}
in.close();
} catch (MalformedURLException me) {
System.out.println(me);
} catch (IOException ioe) {
System.out.println(ioe);
}
}//end main
}
Episode II
Groovy
Groovy
● Los archivos llevan extensión .groovy
● No lleva punto y coma al final
● Es casi al 100% compatible con código java
¿Qué sabe mucha gente sobre
Groovy?
Groovy
<<a flat learning curve for Java
developers>>
Guillaume Laforge
Groovy
BufferedReader br = new BufferedReader( new FileReader("file.txt"));
try {
StringBuilder sb = new StringBuilder() ;
String line = br.readLine() ;
while (line != null) {
sb.append(line) ;
sb.append(System.lineSeparator()) ;
line = br.readLine() ;
}
String everything = sb.toString() ;
} finally {
br.close();
}
Groovy
BufferedReader br = new BufferedReader(new FileReader(" file.txt"))
try {
StringBuilder sb = new StringBuilder()
String line = br.readLine()
while (line != null) {
sb.append(line)
sb.append(System.lineSeparator())
line = br.readLine()
}
String everything = sb.toString()
} finally {
br.close()
}
Groovy
File file = new File("file.txt"))
String everything = file.text
Groovy goodness...
Groovy
URL url = "http://google.com ".toURL()
print url.text
Groovy goodness...
Groovy
● No quiero trollear a Java
Disclaimer
● Java 8 ha dado un paso de gigante
● Pero Groovy mola más ;)
Groovy
Hubert A. Klein Ikkink (MrHaki)
http://www.mrhaki.com/
Groovy Goodness: El libro
Episode III
Básicos y misceláneos de groovy
Básicos y misceláneos de groovy
public class Saludador {
private String usuario;
public String getUsuario() {
return usuario;
}
public void setUsuario(usuario) {
this.usuario = usuario;
}
public String saluda(String nombre){
return ("Hola " + nombre + ", yo soy " + usuario);
}
}
Saludador saludador = new Saludador();
saludador.setUsuario("Pablo");
System.out.println(saludador.saluda("Guillaume"));
Puntos y coma
opcionales
Básicos y misceláneos de groovy
public class Saludador {
private String usuario
public String getUsuario() {
return usuario
}
public void setUsuario(usuario) {
this.usuario = usuario
}
public String saluda(String nombre){
return ("Hola " + nombre + ", yo soy " + usuario)
}
}
Saludador saludador = new Saludador()
saludador.setUsuario("Pablo")
System.out.println(saludador.saluda("Guillaume"))
Paréntesis
opcionales
Básicos y misceláneos de groovy
public class Saludador {
private String usuario
public String getUsuario() {
return usuario
}
public void setUsuario(usuario) {
this.usuario = usuario
}
public String saluda(String nombre){
return "Hola " + nombre + ", yo soy " + usuario
}
}
Saludador saludador = new Saludador()
saludador.setUsuario "Pablo"
System.out.println saludador.saluda("Guillaume")
Returns
opcionales
Básicos y misceláneos de groovy
public class Saludador {
private String usuario
public String getUsuario() {
usuario
}
public void setUsuario(usuario) {
this.usuario = usuario
}
public String saluda(String nombre){
"Hola " + nombre + ", yo soy " + usuario
}
}
Saludador saludador = new Saludador()
saludador.setUsuario "Pablo"
System.out.println saludador.saluda("Guillaume")
Public
opcionales
Básicos y misceláneos de groovy
class Saludador {
private String usuario
String getUsuario() {
usuario
}
void setUsuario(usuario) {
this.usuario = usuario
}
String saluda(String nombre){
"Hola " + nombre + ", yo soy " + usuario
}
}
Saludador saludador = new Saludador()
saludador.setUsuario "Pablo"
System.out.println saludador.saluda("Guillaume")
Tipos
opcionales
Básicos y misceláneos de groovy
class Saludador {
private String usuario
String getUsuario() {
usuario
}
void setUsuario(usuario) {
this.usuario = usuario
}
String saluda(String nombre){
"Hola " + nombre + ", yo soy " + usuario
}
}
def saludador = new Saludador()
saludador.setUsuario "Pablo"
System.out.println saludador.saluda("Guillaume")
Atajo para print
Básicos y misceláneos de groovy
class Saludador {
private String usuario
String getUsuario() {
usuario
}
void setUsuario(usuario) {
this.usuario = usuario
}
String saluda(String nombre){
"Hola " + nombre + ", yo soy " + usuario
}
}
def saludador = new Saludador()
saludador.setUsuario "Pablo"
println saludador.saluda("Guillaume")
Getters y
setters
opcionales
Básicos y misceláneos de groovy
class Saludador {
private String usuario
String saluda(String nombre){
"Hola " + nombre + ", yo soy " + usuario
}
}
def saludador = new Saludador()
saludador.setUsuario "Pablo"
println saludador.saluda("Guillaume")
Invocación al
setter "mágica"
Básicos y misceláneos de groovy
class Saludador {
private String usuario
String saluda(String nombre){
"Hola " + nombre + ", yo soy " + usuario
}
}
def saludador = new Saludador()
saludador.usuario = "Pablo"
println saludador.saluda("Guillaume")
Constructor por
parámetros con
nombre "mágico"
Básicos y misceláneos de groovy
class Saludador {
private String usuario
String saluda(String nombre){
"Hola " + nombre + ", yo soy " + usuario
}
}
def saludador = new Saludador(usuario:"Pablo")
println saludador.saluda("Guillaume")
Cadenas
interpoladas
(GStrings)
Básicos y misceláneos de groovy
class Saludador {
private String usuario
String saluda(String nombre){
"Hola $nombre, yo soy $usuario"
}
}
def saludador = new Saludador(usuario:"Pablo")
println saludador.saluda("Guillaume")
Reformateamos...
Básicos y misceláneos de groovy
class Saludador {
private String usuario
String saluda(String nombre){
"Hola $nombre, yo soy $usuario"
}
}
def saludador = new Saludador(usuario:"Pablo")
println saludador.saluda("Guillaume")
public class Saludador {
private String usuario;
public String getUsuario() {
return usuario;
}
public void setUsuario(usuario) {
this.usuario = usuario;
}
public String saluda(String nombre){
return ("Hola " + nombre + ", yo s
}
}
Saludador saludador = new Saludador();
saludador.setUsuario("Pablo");
System.out.println(saludador.saluda("Guillau
Básicos y misceláneos de groovy
Básicos y misceláneos de groovy
Dinámico
def saluda() {
def a = "hola mundo"
println a
a = 3
print a
}
void despidete() {
Integer a = 3
println a
a = "adios" // Error en tiempo de ejecución
println a
}
Básicos y misceláneos de groovy
Estático. Si quieres.
import groovy.transform.CompileStatic
@CompileStatic
void despidete() {
Integer a = 3
println a
a = "adios" //Error en tiempo de compilación
println a
}
Básicos y misceláneos de groovy
Comparación de cadenas
def a = "hola"
assert "hola" == a
Básicos y misceláneos de groovy
Return opcional
String suma(int a, int b) {
a + b
}
assert suma(2, 3) == 5
Básicos y misceláneos de groovy
Asignación múltiple / Retorno múltiple
def iAmHere() {
[29.20090, 12.90391]
}
def (coordX, coordY) = iAmHere()
assert coordX == 29.20090
assert coordY == 12.90391
Básicos y misceláneos de groovy
Listas (arrays)
//JAVA
String[] lista = new String[] { "uno", "dos", "tres" };
//GROOVY
def lista = ['uno', 'dos', 'tres']
// En realidad son ArrayList
lista.add(1000)
assert 4 == lista.size()
Básicos y misceláneos de groovy
assert ["Murdock"] == equipo[2]
assert ["Hannibal", "Fenix"] == equipo[0..1]
assert ["Murdock", "Fenix"] == equipo[2..1]
assert ["Fenix", "Murdock", "MA"] == equipo[1..-1]
Listas: Sublistas
def equipo = ["Hannibal", "Fenix", "Murdock", "MA"]
Básicos y misceláneos de groovy
Mapas
//JAVA
Map <String, String> mapa = new HashMap<String, String>();
mapa.put("nombre", "Pablo");
mapa.put("apellido", "Alba");
//GROOVY
def mapa = [nombre:"Pablo", apellido:"Alba"]
Básicos y misceláneos de groovy
Casting automático
String diTuNombre() {
Integer a = 3
}
def a = diTuNombre()
assert a == "3"
assert a.class == String
Básicos y misceláneos de groovy
La verdad en Groovy
assert !( null )
assert !( "" )
assert !( [] )
assert !( [:] )
assert !( 0 )
assert new Object()
assert "string"
assert [1, 2, 3]
assert [a:1]
assert 12345
Básicos y misceláneos de groovy
Groovy como lenguaje de scripting
println "Hola " + args[0]
meDaIgualElNombre.groovy
groovy meDaIgualElNombre.groovy Pablo
Episode IV
Operadores
Operadores
Navegación segura
// Modo "JAVA"
if (company != null && company.getAddress() != null
&& company.getAddress().getStreet() != null) {
println company.address.street.name
}
// Modo "Groovy"
println company?.address?.street?.name
Operadores
Operador Elvis
def text
// Operador ternario normal
def ternaryOutput = (text != null) ? text : 'Hello Groovy!'
// Operador Elvis
// Esto se lee: 'Si text no es nulo, asigna text a
// elvisOutput. De otra forma, asigna 'Viva Las Vegas!' a elvisOutput.
def elvisOutput = text ?: 'Viva Las Vegas!'
Operadores
In
// Modo "JAVA"
String[] list = {"a", "b", "c"};
assert Arrays.asList(list).contains("a")
// Modo "GROOVY"
def list = ["a", "b", "c"]
assert "a" in list
Operadores
Multiplicación de String
println '-' * 80
// ----------------------------------------------------------------------------
Episode IV
Strings
Strings
def s1 = 'Esto es una cadena, y podemos usar "comillas dobles" 
sin escaparlas’
Comillas simples
Strings
def s1 = ‘‘‘Esto es una cadena multilínea
podemos escribir
un montón de líneas
sin preocuparnos de todo
el lío de la concatenación
’’’
Comillas simples triples
Strings
def s3 = /Podemos meter casi cualquier cosa en una "string" 'slasy' sin 
escaparla. Se usa mucho para expresiones regulares/
Slashy
Strings
def s1 = "Esto es una cadena, y podemos usar ‘comillas simples’ 
sin escaparlas"
Comillas dobles
Strings
def s1 = """Esto es una cadena multilínea
podemos escribir
un montón de líneas
sin preocuparnos de todo
el lío de la concatenación
"""
Comillas dobles triples
Strings
def nombre = "Pablo"
def s1 = "Hola, $nombre"
assert s1 == "Hola, Pablo"
def edad = 37
def s2 = "En el 2050 tendrás ${edad + 34} años"
assert s2 == "En el 2050 tendrás 71 años"
GStrings
Strings
'42.42'.isNumber()
'42.42'.isDoble()
'42.42'.isFloat()
'42.42'.isInteger()
'42.42'.isLong()
¿Es un número?
Strings
def s = 'Acceder a las cadenas en Groovy es fácil.'
assert 'A' == s.getAt(0)
// Las cadenas funcionan como listas
assert 'A' == s[0]
assert 'Groovy' == s[25..30] // Podemos usar rangos.
Substrings
Strings
assert 'GROOVY' == 'groovy'.toUpperCase()
assert 'groovy' == 'GROOVY'.toLowerCase()
assert 'Groovy' == 'groovy'.capitalize()
Mayúsculas y minúsculas
Strings
def s = 'Esto en otros lenguajes es un dolor...'
String encoded = s.bytes.encodeBase64().toString()
assert 'RXN0byBlbiBvdHJvcyBsZW5ndWFqZXMgZXMgdW4gZG9sb3IuLi4=' == encoded
byte[] decoded = encoded.decodeBase64()
assert s == new String(decoded)
Base64
Episode V
Closures
Closures
def sumador = {a, b -> a + b }
assert sumador (3, 4) == 7
assert sumador (‘H’, ‘ola’) == ‘Hola’
Closure
Closures
def doblador = { it * 2}
assert doblador (3) == 6
assert doblador (‘H’) == ‘HH’
"it"
Closures
def multiplicador = { int a, int b = 10 -> a * b}
assert multiplicador (2, 3) == 6
assert multiplicador (5) == 50
//MissingMethodException
//multiplicador (‘a’)
Valores por defecto
Closures
def printer = System.out.&println
printer "Hola"
Métodos como closures
Episode VI
Listas y mapas
Listas y mapas
assert 'Lobezno' == list.find { it == 'Lobezno' }
assert ['Tormenta', 'Rondador'] == list.findAll { it.size() > 7 }
assert 2 == list.findLastIndexOf { it.size() == 7 }
Listas: Buscando datos
def patrulla = ['Cíclope', 'Lobezno', 'Tormenta',
'Coloso', 'Rondador']
Listas y mapas
def patrulla = ['Cíclope', 'Lobezno', 'Tormenta', 'Coloso', 'Rondador']
Listas: Iteraciones
for (i = 0; i < 5; i++) {
println patrulla[i]
}
5.times{
println patrulla[it]
}
patrulla.each{
println it
}
Listas y mapas
def list = [2,5,1,9,3,4,2,8,9]
assert list.size() == 9
assert list.sum() == 43
assert list.max() == 9
assert list.min() == 1
assert list.count(9) == 2
assert list.count{ it < 5 } == 5
list.sort()
assert list == [1, 2, 2, 3, 4, 5, 8, 9, 9]
list.unique()
assert list == [1, 2, 3, 4, 5, 8, 9]
Listas: Features ‘cool’
Listas y mapas
class Persona{
String nombre
int edad
}
def personas = [
new Persona(nombre: "Pablo", edad: 36),
new Persona(nombre: "Lucía", edad: 12),
new Persona(nombre: "Isabel", edad: 11)
]
def nombres = personas.findAll { it.edad < 18 }
.collect { it.nombre.toUpperCase() }
.join(', ')
assert nombres == "LUCÍA, ISABEL"
Listas: Filter / Map / Reduce
Episode VII
Ecosistema
Ecosistema
No es java sin punto y coma
¡Gracias!
¡Gracias!
http://kaleidos.net/708090/
http://albaontech.wordpress.com
@_pabloalba_
¿Desea saber más?
http://greachconf.com/
Madrid, April 8th & 9th, 2016
http://www.meetup.com/madrid-gug/

Contenu connexe

Tendances

Tendances (10)

Java HashMap
Java HashMapJava HashMap
Java HashMap
 
Django
DjangoDjango
Django
 
Ejercicios en Netbeans
Ejercicios en NetbeansEjercicios en Netbeans
Ejercicios en Netbeans
 
Ejemplo de movimiento en un applet (Thread::Runnable)
Ejemplo de movimiento en un applet (Thread::Runnable)Ejemplo de movimiento en un applet (Thread::Runnable)
Ejemplo de movimiento en un applet (Thread::Runnable)
 
Introducción a Javascript
Introducción a JavascriptIntroducción a Javascript
Introducción a Javascript
 
Tests en Java con Groovy y Spock
Tests en Java con Groovy y SpockTests en Java con Groovy y Spock
Tests en Java con Groovy y Spock
 
Funciones de cadenas
Funciones de cadenasFunciones de cadenas
Funciones de cadenas
 
Practica 5
Practica  5Practica  5
Practica 5
 
Bash Tips Tricks Campus
Bash Tips Tricks CampusBash Tips Tricks Campus
Bash Tips Tricks Campus
 
Taller Matrices En Java
Taller Matrices En JavaTaller Matrices En Java
Taller Matrices En Java
 

En vedette

Madrid GUG - Grails Plugins: Exporter
Madrid GUG - Grails Plugins: ExporterMadrid GUG - Grails Plugins: Exporter
Madrid GUG - Grails Plugins: ExporterIván López Martín
 
Groovy - Grails as a modern scripting language for Web applications
Groovy - Grails as a modern scripting language for Web applicationsGroovy - Grails as a modern scripting language for Web applications
Groovy - Grails as a modern scripting language for Web applicationsIndicThreads
 
T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!
T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!
T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!Iván López Martín
 
Geb+spock: let your functional tests live long and prosper
Geb+spock: let your functional tests live long and prosperGeb+spock: let your functional tests live long and prosper
Geb+spock: let your functional tests live long and prosperEsther Lozano
 
GriffDnie (Griffon Demo)
GriffDnie (Griffon Demo)GriffDnie (Griffon Demo)
GriffDnie (Griffon Demo)Jorge Aguilera
 
Macro macro, burrito burrit
Macro macro, burrito burritMacro macro, burrito burrit
Macro macro, burrito burritMario García
 

En vedette (9)

Madrid GUG - Grails Plugins: Exporter
Madrid GUG - Grails Plugins: ExporterMadrid GUG - Grails Plugins: Exporter
Madrid GUG - Grails Plugins: Exporter
 
Jedi knight
Jedi knightJedi knight
Jedi knight
 
Groovy - Grails as a modern scripting language for Web applications
Groovy - Grails as a modern scripting language for Web applicationsGroovy - Grails as a modern scripting language for Web applications
Groovy - Grails as a modern scripting language for Web applications
 
T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!
T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!
T3chFest 2016 - De Java a Groovy: ¡Hora de Aventuras!
 
Geb+spock: let your functional tests live long and prosper
Geb+spock: let your functional tests live long and prosperGeb+spock: let your functional tests live long and prosper
Geb+spock: let your functional tests live long and prosper
 
De Java a Swift pasando por Groovy
De Java a Swift pasando por GroovyDe Java a Swift pasando por Groovy
De Java a Swift pasando por Groovy
 
GriffDnie (Griffon Demo)
GriffDnie (Griffon Demo)GriffDnie (Griffon Demo)
GriffDnie (Griffon Demo)
 
Macro macro, burrito burrit
Macro macro, burrito burritMacro macro, burrito burrit
Macro macro, burrito burrit
 
Gorm for cassandra
Gorm for cassandraGorm for cassandra
Gorm for cassandra
 

Similaire à Groovy no es java sin punto y coma v3

Programacion en python_2
Programacion en python_2Programacion en python_2
Programacion en python_2wozgeass
 
1.2. kotlin (1)
1.2. kotlin (1)1.2. kotlin (1)
1.2. kotlin (1)xavazque2
 
A lil' of Groovy for Ruby developers
A lil' of Groovy for Ruby developersA lil' of Groovy for Ruby developers
A lil' of Groovy for Ruby developersJose Juan R. Zuñiga
 
Taller de programación clase #3
Taller de programación   clase #3Taller de programación   clase #3
Taller de programación clase #3Juan Cardona
 
Charla congreso web introducción programación funcional en JavaScript
Charla congreso web introducción programación funcional en JavaScriptCharla congreso web introducción programación funcional en JavaScript
Charla congreso web introducción programación funcional en JavaScriptRicardo Pallás Román
 
Poo 4 arraylist_implem
Poo 4 arraylist_implemPoo 4 arraylist_implem
Poo 4 arraylist_implemjlmanmons
 
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11
CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11Miguel Angel
 
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y EficaciaRealizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y EficaciaAndres Almiray
 
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)Videoconferencias UTPL
 
Clase8 innerclasses
Clase8 innerclassesClase8 innerclasses
Clase8 innerclassesjorg_marq
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyJose Juan R. Zuñiga
 
Realizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficaciaRealizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficaciaSoftware Guru
 
Seminario de Groovy y grails
Seminario de Groovy y grailsSeminario de Groovy y grails
Seminario de Groovy y grailsParadigma Digital
 
Dart como alternativa a TypeScript (Codemotion 2016)
Dart como alternativa a TypeScript (Codemotion 2016)Dart como alternativa a TypeScript (Codemotion 2016)
Dart como alternativa a TypeScript (Codemotion 2016)Rafael Bermúdez Míguez
 

Similaire à Groovy no es java sin punto y coma v3 (20)

Introducción a Groovy
Introducción a GroovyIntroducción a Groovy
Introducción a Groovy
 
Introduccion A Groovy
Introduccion A GroovyIntroduccion A Groovy
Introduccion A Groovy
 
Programacion en python_2
Programacion en python_2Programacion en python_2
Programacion en python_2
 
1.2. kotlin (1)
1.2. kotlin (1)1.2. kotlin (1)
1.2. kotlin (1)
 
1.2. kotlin
1.2. kotlin1.2. kotlin
1.2. kotlin
 
A lil' of Groovy for Ruby developers
A lil' of Groovy for Ruby developersA lil' of Groovy for Ruby developers
A lil' of Groovy for Ruby developers
 
Taller de programación clase #3
Taller de programación   clase #3Taller de programación   clase #3
Taller de programación clase #3
 
Charla congreso web introducción programación funcional en JavaScript
Charla congreso web introducción programación funcional en JavaScriptCharla congreso web introducción programación funcional en JavaScript
Charla congreso web introducción programación funcional en JavaScript
 
Poo 4 arraylist_implem
Poo 4 arraylist_implemPoo 4 arraylist_implem
Poo 4 arraylist_implem
 
Clase 7 objetos globales de javaScript
Clase 7 objetos globales de javaScriptClase 7 objetos globales de javaScript
Clase 7 objetos globales de javaScript
 
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11
CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11
 
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y EficaciaRealizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
 
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
 
Clase8 innerclasses
Clase8 innerclassesClase8 innerclasses
Clase8 innerclasses
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con Groovy
 
Tipos basicos de java
Tipos basicos de javaTipos basicos de java
Tipos basicos de java
 
Realizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficaciaRealizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficacia
 
Seminario de Groovy y grails
Seminario de Groovy y grailsSeminario de Groovy y grails
Seminario de Groovy y grails
 
Dart como alternativa a TypeScript (Codemotion 2016)
Dart como alternativa a TypeScript (Codemotion 2016)Dart como alternativa a TypeScript (Codemotion 2016)
Dart como alternativa a TypeScript (Codemotion 2016)
 
Tarea sesion 08_gottlieb
Tarea sesion 08_gottliebTarea sesion 08_gottlieb
Tarea sesion 08_gottlieb
 

Dernier

Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxpabonheidy28
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxJOSEMANUELHERNANDEZH11
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024GiovanniJavierHidalg
 

Dernier (16)

Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docx
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024
 

Groovy no es java sin punto y coma v3

  • 1. Groovy Goodness PABLO ALBA CHAO #708090 Porque Groovy no es Java sin puntos y comas
  • 2. Ego-slide Pablo Alba CTO en Kaleidos Open Source http://kaleidos.net/708090/ http://albaontech.wordpress.com @_pabloalba_
  • 8. Corrían los 90... BufferedReader br = new BufferedReader( new FileReader("file.txt")); try { StringBuilder sb = new StringBuilder(); String line = br.readLine(); while (line != null) { sb.append(line); sb.append(System.lineSeparator()); line = br.readLine(); } String everything = sb.toString(); } finally { br.close(); }
  • 9. Corrían los 90... import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; public class Main { public static void main(String[] args) { try { URL google = new URL("http://www.google.com/"); BufferedReader in = new BufferedReader(newInputStreamReader(google.openStream())); String inputLine; while ((inputLine = in.readLine()) !=null) System.out.println(inputLine); } in.close(); } catch (MalformedURLException me) { System.out.println(me); } catch (IOException ioe) { System.out.println(ioe); } }//end main }
  • 11. Groovy ● Los archivos llevan extensión .groovy ● No lleva punto y coma al final ● Es casi al 100% compatible con código java ¿Qué sabe mucha gente sobre Groovy?
  • 12. Groovy <<a flat learning curve for Java developers>> Guillaume Laforge
  • 13. Groovy BufferedReader br = new BufferedReader( new FileReader("file.txt")); try { StringBuilder sb = new StringBuilder() ; String line = br.readLine() ; while (line != null) { sb.append(line) ; sb.append(System.lineSeparator()) ; line = br.readLine() ; } String everything = sb.toString() ; } finally { br.close(); }
  • 14. Groovy BufferedReader br = new BufferedReader(new FileReader(" file.txt")) try { StringBuilder sb = new StringBuilder() String line = br.readLine() while (line != null) { sb.append(line) sb.append(System.lineSeparator()) line = br.readLine() } String everything = sb.toString() } finally { br.close() }
  • 15. Groovy File file = new File("file.txt")) String everything = file.text Groovy goodness...
  • 16. Groovy URL url = "http://google.com ".toURL() print url.text Groovy goodness...
  • 17. Groovy ● No quiero trollear a Java Disclaimer ● Java 8 ha dado un paso de gigante ● Pero Groovy mola más ;)
  • 18. Groovy Hubert A. Klein Ikkink (MrHaki) http://www.mrhaki.com/ Groovy Goodness: El libro
  • 19. Episode III Básicos y misceláneos de groovy
  • 20. Básicos y misceláneos de groovy public class Saludador { private String usuario; public String getUsuario() { return usuario; } public void setUsuario(usuario) { this.usuario = usuario; } public String saluda(String nombre){ return ("Hola " + nombre + ", yo soy " + usuario); } } Saludador saludador = new Saludador(); saludador.setUsuario("Pablo"); System.out.println(saludador.saluda("Guillaume")); Puntos y coma opcionales
  • 21. Básicos y misceláneos de groovy public class Saludador { private String usuario public String getUsuario() { return usuario } public void setUsuario(usuario) { this.usuario = usuario } public String saluda(String nombre){ return ("Hola " + nombre + ", yo soy " + usuario) } } Saludador saludador = new Saludador() saludador.setUsuario("Pablo") System.out.println(saludador.saluda("Guillaume")) Paréntesis opcionales
  • 22. Básicos y misceláneos de groovy public class Saludador { private String usuario public String getUsuario() { return usuario } public void setUsuario(usuario) { this.usuario = usuario } public String saluda(String nombre){ return "Hola " + nombre + ", yo soy " + usuario } } Saludador saludador = new Saludador() saludador.setUsuario "Pablo" System.out.println saludador.saluda("Guillaume") Returns opcionales
  • 23. Básicos y misceláneos de groovy public class Saludador { private String usuario public String getUsuario() { usuario } public void setUsuario(usuario) { this.usuario = usuario } public String saluda(String nombre){ "Hola " + nombre + ", yo soy " + usuario } } Saludador saludador = new Saludador() saludador.setUsuario "Pablo" System.out.println saludador.saluda("Guillaume") Public opcionales
  • 24. Básicos y misceláneos de groovy class Saludador { private String usuario String getUsuario() { usuario } void setUsuario(usuario) { this.usuario = usuario } String saluda(String nombre){ "Hola " + nombre + ", yo soy " + usuario } } Saludador saludador = new Saludador() saludador.setUsuario "Pablo" System.out.println saludador.saluda("Guillaume") Tipos opcionales
  • 25. Básicos y misceláneos de groovy class Saludador { private String usuario String getUsuario() { usuario } void setUsuario(usuario) { this.usuario = usuario } String saluda(String nombre){ "Hola " + nombre + ", yo soy " + usuario } } def saludador = new Saludador() saludador.setUsuario "Pablo" System.out.println saludador.saluda("Guillaume") Atajo para print
  • 26. Básicos y misceláneos de groovy class Saludador { private String usuario String getUsuario() { usuario } void setUsuario(usuario) { this.usuario = usuario } String saluda(String nombre){ "Hola " + nombre + ", yo soy " + usuario } } def saludador = new Saludador() saludador.setUsuario "Pablo" println saludador.saluda("Guillaume") Getters y setters opcionales
  • 27. Básicos y misceláneos de groovy class Saludador { private String usuario String saluda(String nombre){ "Hola " + nombre + ", yo soy " + usuario } } def saludador = new Saludador() saludador.setUsuario "Pablo" println saludador.saluda("Guillaume") Invocación al setter "mágica"
  • 28. Básicos y misceláneos de groovy class Saludador { private String usuario String saluda(String nombre){ "Hola " + nombre + ", yo soy " + usuario } } def saludador = new Saludador() saludador.usuario = "Pablo" println saludador.saluda("Guillaume") Constructor por parámetros con nombre "mágico"
  • 29. Básicos y misceláneos de groovy class Saludador { private String usuario String saluda(String nombre){ "Hola " + nombre + ", yo soy " + usuario } } def saludador = new Saludador(usuario:"Pablo") println saludador.saluda("Guillaume") Cadenas interpoladas (GStrings)
  • 30. Básicos y misceláneos de groovy class Saludador { private String usuario String saluda(String nombre){ "Hola $nombre, yo soy $usuario" } } def saludador = new Saludador(usuario:"Pablo") println saludador.saluda("Guillaume") Reformateamos...
  • 31. Básicos y misceláneos de groovy class Saludador { private String usuario String saluda(String nombre){ "Hola $nombre, yo soy $usuario" } } def saludador = new Saludador(usuario:"Pablo") println saludador.saluda("Guillaume") public class Saludador { private String usuario; public String getUsuario() { return usuario; } public void setUsuario(usuario) { this.usuario = usuario; } public String saluda(String nombre){ return ("Hola " + nombre + ", yo s } } Saludador saludador = new Saludador(); saludador.setUsuario("Pablo"); System.out.println(saludador.saluda("Guillau
  • 33. Básicos y misceláneos de groovy Dinámico def saluda() { def a = "hola mundo" println a a = 3 print a } void despidete() { Integer a = 3 println a a = "adios" // Error en tiempo de ejecución println a }
  • 34. Básicos y misceláneos de groovy Estático. Si quieres. import groovy.transform.CompileStatic @CompileStatic void despidete() { Integer a = 3 println a a = "adios" //Error en tiempo de compilación println a }
  • 35. Básicos y misceláneos de groovy Comparación de cadenas def a = "hola" assert "hola" == a
  • 36. Básicos y misceláneos de groovy Return opcional String suma(int a, int b) { a + b } assert suma(2, 3) == 5
  • 37. Básicos y misceláneos de groovy Asignación múltiple / Retorno múltiple def iAmHere() { [29.20090, 12.90391] } def (coordX, coordY) = iAmHere() assert coordX == 29.20090 assert coordY == 12.90391
  • 38. Básicos y misceláneos de groovy Listas (arrays) //JAVA String[] lista = new String[] { "uno", "dos", "tres" }; //GROOVY def lista = ['uno', 'dos', 'tres'] // En realidad son ArrayList lista.add(1000) assert 4 == lista.size()
  • 39. Básicos y misceláneos de groovy assert ["Murdock"] == equipo[2] assert ["Hannibal", "Fenix"] == equipo[0..1] assert ["Murdock", "Fenix"] == equipo[2..1] assert ["Fenix", "Murdock", "MA"] == equipo[1..-1] Listas: Sublistas def equipo = ["Hannibal", "Fenix", "Murdock", "MA"]
  • 40. Básicos y misceláneos de groovy Mapas //JAVA Map <String, String> mapa = new HashMap<String, String>(); mapa.put("nombre", "Pablo"); mapa.put("apellido", "Alba"); //GROOVY def mapa = [nombre:"Pablo", apellido:"Alba"]
  • 41. Básicos y misceláneos de groovy Casting automático String diTuNombre() { Integer a = 3 } def a = diTuNombre() assert a == "3" assert a.class == String
  • 42. Básicos y misceláneos de groovy La verdad en Groovy assert !( null ) assert !( "" ) assert !( [] ) assert !( [:] ) assert !( 0 ) assert new Object() assert "string" assert [1, 2, 3] assert [a:1] assert 12345
  • 43. Básicos y misceláneos de groovy Groovy como lenguaje de scripting println "Hola " + args[0] meDaIgualElNombre.groovy groovy meDaIgualElNombre.groovy Pablo
  • 45. Operadores Navegación segura // Modo "JAVA" if (company != null && company.getAddress() != null && company.getAddress().getStreet() != null) { println company.address.street.name } // Modo "Groovy" println company?.address?.street?.name
  • 46. Operadores Operador Elvis def text // Operador ternario normal def ternaryOutput = (text != null) ? text : 'Hello Groovy!' // Operador Elvis // Esto se lee: 'Si text no es nulo, asigna text a // elvisOutput. De otra forma, asigna 'Viva Las Vegas!' a elvisOutput. def elvisOutput = text ?: 'Viva Las Vegas!'
  • 47. Operadores In // Modo "JAVA" String[] list = {"a", "b", "c"}; assert Arrays.asList(list).contains("a") // Modo "GROOVY" def list = ["a", "b", "c"] assert "a" in list
  • 48. Operadores Multiplicación de String println '-' * 80 // ----------------------------------------------------------------------------
  • 50. Strings def s1 = 'Esto es una cadena, y podemos usar "comillas dobles" sin escaparlas’ Comillas simples
  • 51. Strings def s1 = ‘‘‘Esto es una cadena multilínea podemos escribir un montón de líneas sin preocuparnos de todo el lío de la concatenación ’’’ Comillas simples triples
  • 52. Strings def s3 = /Podemos meter casi cualquier cosa en una "string" 'slasy' sin escaparla. Se usa mucho para expresiones regulares/ Slashy
  • 53. Strings def s1 = "Esto es una cadena, y podemos usar ‘comillas simples’ sin escaparlas" Comillas dobles
  • 54. Strings def s1 = """Esto es una cadena multilínea podemos escribir un montón de líneas sin preocuparnos de todo el lío de la concatenación """ Comillas dobles triples
  • 55. Strings def nombre = "Pablo" def s1 = "Hola, $nombre" assert s1 == "Hola, Pablo" def edad = 37 def s2 = "En el 2050 tendrás ${edad + 34} años" assert s2 == "En el 2050 tendrás 71 años" GStrings
  • 57. Strings def s = 'Acceder a las cadenas en Groovy es fácil.' assert 'A' == s.getAt(0) // Las cadenas funcionan como listas assert 'A' == s[0] assert 'Groovy' == s[25..30] // Podemos usar rangos. Substrings
  • 58. Strings assert 'GROOVY' == 'groovy'.toUpperCase() assert 'groovy' == 'GROOVY'.toLowerCase() assert 'Groovy' == 'groovy'.capitalize() Mayúsculas y minúsculas
  • 59. Strings def s = 'Esto en otros lenguajes es un dolor...' String encoded = s.bytes.encodeBase64().toString() assert 'RXN0byBlbiBvdHJvcyBsZW5ndWFqZXMgZXMgdW4gZG9sb3IuLi4=' == encoded byte[] decoded = encoded.decodeBase64() assert s == new String(decoded) Base64
  • 61. Closures def sumador = {a, b -> a + b } assert sumador (3, 4) == 7 assert sumador (‘H’, ‘ola’) == ‘Hola’ Closure
  • 62. Closures def doblador = { it * 2} assert doblador (3) == 6 assert doblador (‘H’) == ‘HH’ "it"
  • 63. Closures def multiplicador = { int a, int b = 10 -> a * b} assert multiplicador (2, 3) == 6 assert multiplicador (5) == 50 //MissingMethodException //multiplicador (‘a’) Valores por defecto
  • 64. Closures def printer = System.out.&println printer "Hola" Métodos como closures
  • 66. Listas y mapas assert 'Lobezno' == list.find { it == 'Lobezno' } assert ['Tormenta', 'Rondador'] == list.findAll { it.size() > 7 } assert 2 == list.findLastIndexOf { it.size() == 7 } Listas: Buscando datos def patrulla = ['Cíclope', 'Lobezno', 'Tormenta', 'Coloso', 'Rondador']
  • 67. Listas y mapas def patrulla = ['Cíclope', 'Lobezno', 'Tormenta', 'Coloso', 'Rondador'] Listas: Iteraciones for (i = 0; i < 5; i++) { println patrulla[i] } 5.times{ println patrulla[it] } patrulla.each{ println it }
  • 68. Listas y mapas def list = [2,5,1,9,3,4,2,8,9] assert list.size() == 9 assert list.sum() == 43 assert list.max() == 9 assert list.min() == 1 assert list.count(9) == 2 assert list.count{ it < 5 } == 5 list.sort() assert list == [1, 2, 2, 3, 4, 5, 8, 9, 9] list.unique() assert list == [1, 2, 3, 4, 5, 8, 9] Listas: Features ‘cool’
  • 69. Listas y mapas class Persona{ String nombre int edad } def personas = [ new Persona(nombre: "Pablo", edad: 36), new Persona(nombre: "Lucía", edad: 12), new Persona(nombre: "Isabel", edad: 11) ] def nombres = personas.findAll { it.edad < 18 } .collect { it.nombre.toUpperCase() } .join(', ') assert nombres == "LUCÍA, ISABEL" Listas: Filter / Map / Reduce
  • 72. No es java sin punto y coma
  • 74. ¿Desea saber más? http://greachconf.com/ Madrid, April 8th & 9th, 2016 http://www.meetup.com/madrid-gug/