Tempo de leitura: menos de 1 minuto
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.
