Método X Closure: Entendendo as Closures no Groovy – Parte 1

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?
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.
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.

  1. Entendendo as Closures no Groovy;
  2. Método X Closure;
  3. Teste de desempenho com Closures e Métodos;

Entendendo as Closures no Groovy

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.

Para os que estão acostumados com desenvolvimento java e já teve a oportunidade 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 seguinte:

def clos = { print “Hello”}
// - clos2: Onde a closure recebera algum valor na sua chamada e imprimirá o mesmo.
def clos2 = {print it}.
clos2(‘Hello’) /*Onde o mesmo imprime Hello*/

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 fazer isso no groovy.
1 – Podemos utilizar o collect aplicando a logica para cada item iterado:

def list = ['a','e','i''o','u']
def newList = []

list.collect( newList ) { it.toUpperCase() }

Definição: Foi criada uma lista com as vogais e uma lista vazia que receberá 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 parâmetro.
Logo no final teremos a seguinte lista [“A”, “E”, “I”, “O”, “U”]

2 – Digamos que a logica a ser aplicada a cada item é um pouco mais complicada, também podemos encapsula-la em outra closure.

def list = ['a','e','i','o','u']
def newList = []

def closAux = { it.toUpperCase() }
list.collect( newList, closAux)

Definição: Neste caso estamos trabalhando com a mesma lógica, mas aqui podemos aproveitar a segunda closure para encapsular uma lógica mais complexa 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 passando 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.

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.

Por: Jonatas Emidio

Anúncios
Etiquetado

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: