O que é Groovy - WordPress.com

Transcrição

O que é Groovy - WordPress.com
Tribunal Regional Eleitoral do Tocantins
Secretaria de Tecnologia da Informação
Coordenadoria de Desenvolvimento de Sistemas
Grails
Aula 2: Introdução à linguagem
Groovy
Cleórbete Santos
[email protected]
Michael Schuenck dos Santos
[email protected]
O que é Groovy
●
●
●
●
●
É uma linguagem dinâmica para a plataforma
Java, com sintaxe Java-like;
Groovy é uma linguagem de script (também);
'Groovar' é 'Javar' de maneira especial;
Todo o poder do Java, incluindo suas milhares
de bibliotecas, estão disponíveis em Groovy;
Groovy é 'Java Friendly' (Seamless Integration
& Sintax Alingment);
In the beginning...
●
●
●
●
...it was cold, dark, an empty space...
...mas no dia 29 de agosto de 2003...
...James Strachan publicou em seu blog:
...“minha idéia inicial é fazer uma pequena
linguagem dinâmica, que seja compilada
diretamente em classes Java e que tenha
toda a produtividade elegante encontrada
em Ruby e Python, mas que permita
reusar, estender, implementar e testar
código Java já existente”;
Seamless Integration
●
●
●
●
●
●
●
Groovy 'roda' sem adaptações no JRE;
Groovy faz uso de todas as bibliotecas Java;
Classes Groovy são outra maneira de
expressar classes Java;
Todo tipo em Groovy é subtipo de
Java.lang.object;
Pode-se instanciar uma classe Groovy em uma
classe Java (e vice-versa);
A JVM é inconsciente sobre o código Groovy;
Em suma, Groovy é apenas Java + 1 jar;
Syntax Alignment
●
●
●
●
●
●
Embora diferente, é compreensível;
Java: import java.util.*; Date x = new Date();
Groovy: x = new Date()
Groovy é compacta (cadê o import?);
Groovy não precisa de pontos-e-vírgulas
quando pode entender o código sem eles;
Programadores Java sentem-se em casa;
Lendo um arquivo de texto
●
//Java
●
import java.io.BufferedReader; import java.io.FileReader; import java.io.FileNotFoundException; import java.io.IOException;
●
public class FileTest {
●
public static void main(String[] args) {
●
try {String arquivo = "teste.txt";
●
String linha = "";
●
StringBuilder sb = new StringBuilder();
●
BufferedReader br = new BufferedReader(new FileReader(arquivo));
●
while ((linha = br.readLine()) !=null) {sb.append(line);}
System.out.println("sb.toString() = " + sb.toString());
●
●
} catch (FileNotFoundException e) {
●
System.out.println("e = " + e);
} catch (IOException e) {
●
System.out.println("e = " + e);
●
}
●
}
●
●
}
Lendo um arquivo de texto...
●
//Groovy
println new File(“teste.txt”).text
Comentários
●
#! usr/bin/groovy
●
// comentário de uma linha
●
/* comentário
●
de várias
●
linhas */
●
●
Obs.: O shebang é permitido apenas na
primeira linha;
O shebang faz com que os S.O.'s encontrem o
bootstrap do Groovy e rodem a aplicação;
Import's implícitos
●
Groovy:
. groovy.lang.*
. groovy.util.*
. java.lang.*
. java.util.*
. java.net.*
. java.io.*
. java.math.BigInteger
. java.math.BigDecimal
●
Java: java.lang.*
Classes Groovy
●
●
●
●
●
●
●
Campos e propriedades são idênticos;
Métodos e campos são public (default);
Groovy gera os getters e setters;
Um atributo sem modificador é private e seus
métodos de acesso, public (default);
Se necessário, pode-se sobrescrever os
métodos de acesso;
Acesso externo à classe = uso das
propriedades;
Acesso interno à classe = não uso das
propriedades (acesso direto ao campo);
Exemplo de Acesso aos Campos
●
def livro = new Livro()
//usando a propriedade
livro.setTitulo('O morro dos ventos...');
//usando a propriedade também!
livro.titulo('O morro dos ventos...');
Analisando uma Classe Groovy
●
class Livro{
String titulo
def saudacao(nome){ // def?
print(“Olá, ${nome}!”) // GString
} // Sem return?
}
GString
●
●
●
Em Groovy usa-se aspas duplas ou simples
para strings;
As strings de aspas duplas permitem o uso de
placeholders. Ex.:
def filosofo = 'Sören Kierkegaard'
def livro = 'O desespero humano'
print(“${livro} foi escrito por ${filosofo}”)
A verdade em Groovy
●
●
●
Em C, 0 é false, e outro número é true;
Java exige que o valor represente um boolean;
Em Groovy:
. Boolean: valor true
. Match: um match ser true
. Collection: não estar vazia
. Map: não estar vazio
. String/Gstring: não estar vazia
. Número/Caracter: não ser 0
Lists
●
●
●
Servem para armazenamento de valores;
A recuperação é por meio do índice;
Ex.:
def romanos = [‘’,’I’,’II’,’III’,’IV’,’V’,’VI’]
if (romanos[5]==’V’) // true
romanos[7]=’VII’
if (romanos.size() == 8) // true
Maps
●
●
●
Servem para armazenamento chave/valor;
A recuperação é por meio da chave;
Ex.:
def autores=[1:’Diderot’,
7:’Descartes’,
3:’Voltaire’’]
if (autores[2]==’Descartes’) // true
autores[10]=’Goethe’
if (autores.size()==4) // true
Ranges
●
●
●
“Intervalos para facilitar a vida...”
“... e não existem em Java... oh!”
Ex.:
def intervalo = 1..10
if (intervalo.contains(5)) // true
if (intervalo.size()==10) // true
intervalo.from // = 1
intervalo.to // 10
intervalo.reverse() // 10..1
Closures
●
●
Closure em inglês...
São blocos 'enclausurados' de código tratados
como objetos;
Closures (continuação)
●
Ex.:
def clo = { println “Hello, Kitty!” }
clo() // Escreve “Hello, Kitty!”
def soma = { num1, num2 -> println num1+num2 }
soma(10,5) // Escreve ‘15’
●
●
●
●
●
O token '->' é opcional quando < 2 argumentos;
Há sempre 1 argumento 'it' (implícito);
O 'it' não precisa ser declarado (como o 'this');
Numa chamada sem argumentos, 'it' será null;
Closures sempre retornam um valor (com uso
de return ou não);
Closures (continuação)
●
Ex.:
def clo = { println it+1 }
clo(10) // Escreve ‘11’
●
Ex.:
def x = 5 // var externa
def clo = {num -> println num+x}
clo(10) // Escreve ‘15’
Estruturas de controle
●
●
●
Groovy suporta a mesma estrutura de IF,
Nested IF, e Operador Ternário do Java;
O Switch do Groovy permite vários testes
diferentes;
Groovy suporta o While e o For do Java,
mas o For do Groovy é muito mais prático;
Estruturas de controle
(continuação)
switch ( x ) {
case "foo":
result = "found foo"
case "bar":
result += "bar"
case [4, 5, 6, 'inList']:
result = "list"
break
case 12..30:
result = "range"
break
Estruturas de controle
(continuação)
●
def x = 0 // iteração por range
for ( i in 0..9 ) {
x += i
}
●
def x = 0 // iteração por list
for ( i in [0, 1, 2, 3, 4] ) {
x += i
}
Estruturas de controle
(continuação)
●
array = (0..4).toArray() // iteração por array
x=0
for ( i in array ) {
x += i
}
●
def map = ['abc':1, 'def':2, 'xyz':3] // iteração por map
x=0
for ( e in map ) {
x += e.value
}
Estruturas de controle
(continuação)
●
Os loops podem ser utilizados com as closures:
def stringList = [ "nietzsche", "feuerbach",
"bakunin", "blake", "kant"]
stringList.each() { println "${it}" }
def stringMap = [ "vo":"voltaire", "br":"brönte",
"ma":"macgowan", "sh":"shelley", "st":"stoker"]
stringMap.each() { chave, valor -> println
"Chave: ${chave} / Valor: ${valor}" };
E agora... O momento mais
esperado da aula...
O FIM! :)
Muito obrigado.

Documentos relacionados