2. INÍCIO DA DÚVIDA
Uma das coisas que mais tem me chamado a atenção no
groovy é o seu suporte à closures.
Logo passei a utiliza-las no lugar dos métodos, já que a
principio a função era a mesma. No entanto me surgiu uma
dúvida… Será que eu ganho ou perco desempenho utilizando-
as na aplicação?
3. A BUSCA
Iniciei as consultas no google e não tive muito sucesso, em
seguida postei minha duvida no grails brasil e pouco depois já
tinham várias respostas. Percebi que o conteúdo que estava
sendo gerado era muito rico e tive a ideia de compilar todas
essas informações em um post de fácil entendimento.
4. A SACADA
Pois bem, para começar “métodos e closures” podem até
trazer o mesmo resultado, mas eles não são a mesma coisa.
Este artigo será dividido em 3 posts, pois o mesmo possui
bastante conteúdo.
Entendendo as Closures no Groovy;
Método X Closure;
Teste de desempenho com Closures e Métodos;
5. GROOVY IN ACTION
Segundo o Livro Groovy in action:
closures são importantes, muito
importantes, são de longe um dos
recursos mais importantes do
groovy.
Closure é um bloco de codígo encapsulado em
um objeto. Definição tambem do Groovy in
action.
6. EXEMPLO 1
Para os que estão acostumados com desenvolvimento java e já teve a oport
unidade de escrever uma closure ,deve ter notado que seu fluxo lógico é
diferente do tradicional, mas assim que nos acostumamos com o seu estilo
de escrita os algoritmos fluem como água.
Um simples exemplo de closure utilizado na documentação do groovy é o se
guinte:
<font color="#4a86e8">def </font>clos = { <b>print </b>“Hello”}
<font color="#00ff00">// - clos2: Onde a closure recebera algum valor na sua chamad
<font color="#4a86e8">def </font>clos2 = {<b>print </b>it}. clos2(‘Hello’) /*Onde o
7. TRABALHANDO COM LISTAS
Também da documentação do groovy, temos dois exemplos bem interessantes
de closures para listas.
Suponha que você precise varrer uma determinada
lista e aplicar alguma lógica em cada item antes de inseri-los em outra
lista.
Pois bem… Temos basicamente duas formas simples de fazerisso
no groovy.
8. LISTA: IDEIA 1
1 – Podemos utilizar o collect aplicando a logica para cada
item iterado:
Definição: Foi criada uma lista com as vogais e uma lista vazia que rece
berá o maiúsculo de cada vogal.
Neste caso o collect é utilizado para aplicar a
logica ao it (variável default no groovy para closures com apenas um par
âmetro – neste caso uma outra lista) e inseri-lo na lista passada por pa
râmetro.
Logo no final teremos a seguinte lista ["A", "E"
, "I", "O", "U"]
<font color="#4a86e8"><br></font>
<font color="#4a86e8">def </font>list = ['a','e','i''o','u']
<font color="#4a86e8">def </font>newList = []
list.<font color="#4a86e8">collect</font>( newList ) { it.toUpperCase() }
<br>
9. LISTA: IDEIA 2
2 – Digamos que a logica a ser aplicada a cada item é um
pouco mais complicada, também podemos encapsula-la em
outra closure.
<font color="#4a86e8">def </font>list = ['a','e','i','o','u']
<font color="#4a86e8">def </font>newList = []
<font color="#4a86e8">def </font>closAux = { it.toUpperCase
list.<font color="#4a86e8">collect</font>( newList, closAux
Definição: Neste caso estamos trabalhando com a mesma lógica, mas aqui p
odemos aproveitar a segunda closure para encapsular uma lógica mais comp
lexa a ser atribuída a cada atributo da lista iterada.
Aqui, temos uma nova closure criada que atribui
uma lógica (no it) para no final retorna-lo.
Logo em seguida podemos chamar o collect passand
o a nova lista e a closure. Pronto, a logica da closure passada por parâ
metro será utilizada para cada item iterado da lista e atribuindo a nova
lista.
10. FIM
Por fim. É claro que não paramos por aqui.
Closures no groovy pode se transformar em
um mundo quando utilizamos a boa e velha
lógica de programação em conjunto com os
conceitos da linguagem.
Lembrando que este post foi só um
esclarecimento de closure para dar
continuidade nos próximos posts.