Groovy #3: Collections

Tempo de leitura: menos de 1 minuto

Groovy, um pouco sobre collections

Fala galera, depois de uma semana só falando do GIT, vamos retomar os estudos sobre Groovy.

Hoje falaremos sobre Collections em Groovy, que na minha opinião é onde o Groovy se destaca se comparado ao Java.

Observação: Para que você rode os exemplos sem a necessidade de instalação do Groovy, sugiro a leitura do post: Groovy Web Console.

Como instanciar?

O Groovy dispensa o uso da palavra reservada new (como fazemos do Java), para instanciar uma lista. Veja os exemplo:

[code language=”java”]
// No Java fazemos assim:
List<String> minhaLista = new ArraysList<String>();
minhaLista.add("item1");
minhaLista.add("item2");
[/code]

[code language=”groovy”]
// No Groovy, é bem mas fácil, além do que, já posso criar
// uma lista iniciada (com valores) usando apenas uma linha de código.
def minhaListaGroovy = ["item1", "item2"]

//Criando lista em branco
def minhaListaGroovy2 = []
[/code]

Nesse exemplo, economizamos 2 linhas de código. Outras coisas que devemos saber, é que quando usamos o “[]”, o Groovy infere o tipo da variável, por padrão, o ArrayList é a implementação padrão, como o conteúdo desse lista é uma String, então o tipo da variável “minhaListaGroovy” é ArraysList<String>. Legal né?

Importante mencionar que caso você precise de um Array de String (String[]), basta então informar o Groovy o tipo de retorno, para isso use a palavra reservada “as”:

[code language=”groovy”]
def minhaListaGroovy = ["item1", "item2"] as String[]
[/code]

A criação de um Map em Groovy também é muito simplificada e muito parecido com o List, para isso, basta usar “[:]”, vejamos:

[code language=”groovy”]
//Criando mapa já com valores (já inicializados)
def meuMapa = ["key1": "value1", "key2": "value2"]

//Criando mapa em branco
def meuMapa = [:]
[/code]

No exemplo, instanciamos um HashMap (implementação padrão no Groovy). O carácter  “:” separa a chave do valor de cada entry do mapa.

Acessar um elemento

Para acessar um elemento de uma lista, é simples, é bem parecido com o acesso de um array:

[code language=”groovy”]
//Acesso a um elemento da lista
def minhaListaGroovy = ["item1", "item2"]
println minhaListaGroovy[0] // saída: item1
//Acesso reverso a lista, -1 é último, -2 penúltimo, etc…
println minhaListaGroovy[-1] // saída: item2​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

//Acesso a um elemento do mapa
def meuMapa = ["key1": "value1", "key2": "value2"]
println meuMapa["key1"] // saída: value1

// A forma Java de acesso também pode ser usada
println meuMapa.get(0) // saída: item1
println meuMapa.get("key1") // saída: value1
[/code]

Nota: Como diria um grande amigo meu (Carlos Garbiatti), deu dor de barriga (não sabe como em Groovy) escreva em Java que funciona.

Atribuindo valor a um elemento

Existem várias forma de atribuição de valores em elementos de uma Collection  no Groovy, abaixo segue algumas:

[code language=”groovy”]
def minhaListaGroovy = []
// Atribuição simples
minhaListaGroovy[0] = "item1"

// ShiftLeft (<<), essa é uma forma de atribuição,
// nesse caso não precisamos saber em qual elemento atribuir
minhaListaGroovy << "item2"
println minhaListaGroovy // saída: [item1, item2]

// A atribuição de mapa é bem parecida
def meuMapa = [:] 
// ShiftLeft
meuMapa << [0:"item1"]
meuMapa << [1:"item2", 2:"item2"]
//Outras formas
meuMapa[3] = "teste 3"
meuMapa.putAt(4, ‘teste4’)
println meuMapa // saída: [0:item1, 1:item2, 2:item2, 3:teste 3, 4:teste4]
[/code]

Métodos curiosos

É possível obter a sub lista de uma lista maior usando o recuso range:

[code language=”groovy”]
def minhaLista = ["item1", "item2", "item3", "item4"]
println minhaLista[0..1] //saída: ["item1", "item2"]
println minhaLista[1..3] //saída: ["item2", "item3", "item4"]
[/code]

Para obter um sub lista usando range, basta usar o “..” ente dois número, o primeiro indica onde começa o segundo onde termina, no primeiro exemplo solicitei os elementos 0 e 1 da lista, no segundo exemplo os elementos 1 ao 3.

É possível também obter os elementos que deseja, nesse caso utilize o “,” entre os números:

[code language=”groovy”]
def minhaLista = ["item1", "item2", "item3", "item4"]
println minhaLista[0,1] //saída: ["item1", "item2"]
println minhaLista[1,3] //saída: ["item2", "item4"]
[/code]

Em um array, para sabermos o tamanho, normalmente usamos o atributo length, no Groovy também é possível usar o método size():

[code language=”groovy”]
def array = ["item1", "item2", "item3", "item4"] as String[]
println array.length //saída: 4
println array.size() //saída: 4
[/code]

É possível obter o menor e o maior valor de uma lista apenas acessando um método:

[code language=”groovy”]
//Exemplo 1:
def array = [50,124,5,158,65]
println array.min() //saída: 5
println array.max() //saída: 158

//Exemplo 2:
//dá para saber qual é a menor ou maior palavra em uma lista
def array2 = ["Java", "Groovy", "Javascript"]
println array2.min{ it.size() } //saída: Java
println array2.max{ it.size() } //saída: Javascript​​​​​
[/code]

Nota: Nesse exemplo 2, sobrescrevemos o método min e max para calcular o tamanho de uma palavra. Os caracteres “{…}” são chamados de closure. Pense em closure como um método que pode ser passado por parâmetro para outro método executa-lo. Em outra oportunidade falaremos mais sobre closure.

Iteração de collections

O Groovy disponibiliza vários recursos valiosos para iteração em collection, muitos deles brilham os olhos ao usar. Nesse quesito o Groovy é uma mão na roda se comparado com os recursos do Java. Vejamos abaixo os métodos que mais utilizo:

Métodos each e eachWithIndex

Como o nome diz, itera item a item em uma lista, exemplo:

[code language=”groovy”]
def array = ["item1", "item2", "item3", "item4"]
array.each{ println it }
//saída:
//item1
//item2
//item3
//item4

array.eachWithIndex{it ,i -> println "$i: $it"}
//saída:
//0: item1
//1: item2
//2: item3
//3: item4
[/code]

Métodos find e findAll

Esse método é muito útil para encontrar um elemento em uma collection.

[code language=”groovy”]
def array = ["item1", "item2", "item3", "item4"]
// retorno o primeiro elemento que corresponde a match
println array.find{ (it[4] as int) > 2 } //saída: item3
// retorna lista com todos elementos que correspondem a match
println array.findAll{ (it[4] as int) > 2 } //saída: ["item3", "item4"]
[/code]

Método collect

Método responsável por coletar uma determinada informação de um objeto em uma lista, retornando uma lista com o mesmo número de elementos, apenas com a informação coletada.

[code language=”groovy”]
def array = ["item1", "item2", "item3", "item4"]
//obtenho apenas o carácter 5 de cada um dos elementos
println array.collect{ it[4] } // saída: [1, 2, 3, 4]
[/code]

Métodos minus e plus / Operadores – e +

É possível utilizar os operadores – e + (ou métodos minus e plus) em uma lista, o primeiro retorna uma nova lista sem o elemento removido, já o segundo retorna uma nova lista com um novo elemento adicionado.

[code language=”groovy”]
def array = ["item1", "item2", "item3", "item4"]
println array – "item3" // saída: [item1, item2, item4]
println array + "item5" // saída: [item1, item2, item3, item4, item5] 
[/code]

Método sort

Como o nome diz, serve para ordenar uma lista.

[code language=”groovy”]
def array = ["item5", "item2", "item4", "item1", "item3"]
println array.sort() // saída: [item1, item2, item3, item4, item5]
[/code]

Conclusão

Trabalhar com collection em Groovy é muito produtivo, neste post, apenas dei uma pincelada, existem muitos outros métodos disponíveis para uso.

Para mais informações consulte a documentação oficial no site do Groovy.

Não deixe de ler os posts anteriores sobre Groovy:

Espero que tenham gostado, até a próxima.

 

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *