Um recurso muito bacana do Groovy é o operador spread, que é usado quando desejamos invocar um método em todos os objetos presentes em um objeto agregador (Collection).
Vamos supor que eu tenha uma classe tal como a implementada abaixo:
class DigaSeuNome { String nome void fale() {println nome} }
E que eu tenha uma coleção populada tal como no código abaixo:
def lista = [new DigaSeuNome(nome:"Juca"), new DigaSeuNome(nome:"Zeca")]
Em Java, se eu quiser executar o método fale() em cada uma das minhas instâncias, eu faria algo como o código abaixo:
for (DigaSeuNome instancia : lista) { instancia.fale() }
E em Groovy? Assim:
lista*.fale() // Saida: // Primeiro seŕa impresso Juca e depois Zeca
Se o método a ser executado retornar um valor, o operador spread nos trás como retorno um vetor cujo conteúdo é justamente o resultado da operação do método. O código abaixo fala por si próprio:
def lista = ["aa", "bbb", "cccc"] assert lista*.size() == [2,3,4]
Muito legal.