{"id":231,"date":"2008-12-30T12:59:56","date_gmt":"2008-12-30T15:59:56","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=231"},"modified":"2008-12-30T12:59:56","modified_gmt":"2008-12-30T15:59:56","slug":"basico-do-groovy-para-quem-for-aprender-grails","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=231","title":{"rendered":"B\u00e1sico do Groovy para quem for aprender Grails"},"content":{"rendered":"<p><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-235 alignleft\" title=\"groovylogo\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png\" alt=\"\" width=\"203\" height=\"100\" \/><\/a>Antes de come\u00e7armos a trabalhar diretamente com Grails, conv\u00e9m conhecer o b\u00e1sico do Groovy. Afinal de contas, \u00e9 a linguagem por tr\u00e1s da ferramenta e, mais do que isto, trata-se tamb\u00e9m de uma linguagem muito interessante para se trabalhar (programadores Java podem ver varios detalhes da linguagem que realmente <a href=\"https:\/\/devkico.itexto.com.br\/?p=62\" target=\"_blank\">surpreendem<\/a>).<\/p>\n<h3><strong>O que \u00e9 Groovy?<\/strong><\/h3>\n<p>No <a href=\"http:\/\/groovy.codehaus.org\" target=\"_blank\">site oficial da linguagem<\/a>, Groovy \u00e9 definido como uma &#8220;linguagem \u00e1gil e din\u00e2mica para a plataforma Java com muitas ferramentas que s\u00e3o inspiradas em linguagens como Python, Ruby e Smalltalk, tornando-as dispon\u00edveis aos programadores Java, usando uma sintaxe pr\u00f3xima ao Java&#8221;. Se voc\u00ea j\u00e1 programa em Java, portanto, aprender Groovy n\u00e3o ser\u00e1 uma tarefa de outro mundo: na realidade, a sintaxe do Groovy \u00e9 pr\u00e1ticamente a mesma que a do Java. A diferen\u00e7a est\u00e1 nos recursos adicionais que a linguagem oferece.<\/p>\n<p>Antes de pormos a m\u00e3o na massa, no entanto, devemos primeiro nos livrar dos preconceitos ligados ao Groovy, decorrentes da id\u00e9ia de que trata-se apenas de &#8220;mais uma linguagem de script&#8221;. Sim: Groovy pode ser usada como uma linguagem de script (e funciona muito bem para este fim), por\u00e9m tamb\u00e9m pode gerar c\u00f3digo compilado em bytecode que, consequentemente, \u00e9 integrado de forma transparente a c\u00f3digo Java pr\u00e9 existente. Este \u00e9 um dos pontos fortes da linguagem: c\u00f3digo Java chama c\u00f3digo Groovy (e vice versa) sem saber em qual linguagem o mesmo foi escrito. Ali\u00e1s, esta \u00e9 a tend\u00eancia da plataforma Java agora: tornar-se mais popular por ser uma plataforma de execu\u00e7\u00e3o do que uma linguagem de programa\u00e7\u00e3o.<\/p>\n<p>Sendo assim&#8230; os detalhes que importam:<\/p>\n<h3>Instalando o Groovy<\/h3>\n<p>Se voc\u00ea for usar Groovy apenas com Grails, que por sua vez j\u00e1 se encontra instalado em seu computador, n\u00e3o \u00e9 necess\u00e1rio fazer nada, pois o <strong>Groovy j\u00e1 v\u00eam embutido no Grails<\/strong>.<\/p>\n<p>Caso contr\u00e1rio, a sua instala\u00e7\u00e3o \u00e9 bastante simples. Basta baixar sua \u00faltima vers\u00e3o em <a href=\"http:\/\/groovy.codehaus.org\" target=\"_blank\">http:\/\/groovy.codehaus.org<\/a> e descompactar o arquivo bin\u00e1rio em um diret\u00f3rio de sua escolha. O \u00fanico requisito para se usar o Groovy consiste na instala\u00e7\u00e3o do JDK 1.4 ou posterior. Em seguida, lembre-se de incluir o diret\u00f3rio bin da sua instala\u00e7\u00e3o do Groovy no path do seu sistema e tamb\u00e9m de possuir a veri\u00e1vel de ambiente JAVA_HOME definida em seu sistema.<\/p>\n<h3>Diferen\u00e7as b\u00e1sicas entre c\u00f3digo Java e Groovy<\/h3>\n<p>Como mencionado anteriormente, a sintaxe do Groovy n\u00e3o \u00e9 muito diferente da que encontramos em Java. Os principais diferenciais consiste em:<\/p>\n<p><strong>ponto e v\u00edrgula opcional<\/strong>: se voc\u00ea for digitar apenas um comando em uma linha, n\u00e3o precisa digitar o ponto e v\u00edrgula. No caso de mais de um comando, no entanto, j\u00e1 \u00e9 necess\u00e1rio.<\/p>\n<p>Exemplo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nprintln &quot;Sou um comando sem ponto e virgula. N\u00e3o \u00e9 legal?&quot;\r\n\r\nprintln &quot;Eu j\u00e1 tenho ponto e virgula no final. Sou mais tradicional&quot;;\r\n\r\nprintln &quot;Mais de um&quot;; println &quot;comando&quot;; println &quot;na mesma&quot;; println &quot;linha.&quot;;\r\n\r\n<\/pre>\n<p><strong>conceito de verdade:\u00a0<span style=\"font-weight: normal;\">Groovy extende o conceito de verdadeiro com o qual estamos habituados a trabalhar em Java. Al\u00e9m do conceito tradicional, Groovy tamb\u00e9m considera verdadeiro qualquer valor que seja diferente de null, tal como nos exemplos abaixo:<\/span><\/strong><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nString str = &quot;Sou uma string n\u00e3o nula&quot;\r\nString strNula = null\r\nif (str) {\r\n\u00a0\u00a0println &quot;Eu com certeza serei impresso&quot;\u00a0\r\n\r\n}\u00a0\r\n\r\nif (! strNula) {\r\n\u00a0\u00a0 println &quot;Eu vou ser impresso, pois meu teste consistiu em uma string nula negada!&quot;\u00a0\r\n\r\n}\r\n\r\n<\/pre>\n<p><strong>&#8220;main opcional&#8221;<\/strong>: se estiver trabalhando com Groovy na forma de um script, pode considerar o seu arquivo de c\u00f3digo fonte como um main. Tudo o que estiver fora das chaves ser\u00e1 considerado c\u00f3digo a ser executado, tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nprintln &quot;Veja, sou um script feito em Groovy&quot;\r\n\r\nboolean maiorQue(int a, int b) {\r\n\r\n\u00a0\u00a0 return a &lt; b\r\n\r\n}\r\n\r\nprintln &quot;Reparou como eu simplesmente &#039;ignorei&#039; a fun\u00e7\u00e3o maiorQue e continuei imprimindo?&quot;\r\n\r\n&amp;#91;\/code&amp;#93;\r\n\r\nGerar\u00e1 a saida\r\n\r\n&amp;#91;code language=&#039;java&#039;&amp;#93;\r\n\r\nVeja, sou um script feito em Groovy\r\nReparou como eu simplesmente &#039;ignorei&#039; a fun\u00e7\u00e3o maiorQue e continuei imprimindo?\u00a0\r\n\r\n&amp;#91;\/code&amp;#93;\r\n\r\n&lt;strong&gt;Tudo \u00e9 considerado objeto:&lt;\/strong&gt;\u00a0ao contr\u00e1rio do Java em que possuimos tipos primitivos e n\u00e3o primitivos, em Groovy tudo \u00e9 considerado objeto. Sendo assim, os tipos primitivos do Java s\u00e3o convertidos para suas respectivas classes encapsuladoras de forma transparente para o programador, tal como no exemplo abaixo:\r\n\r\n&#x5B;code language=&#039;java&#039;]\r\n\r\nint inteiro = 4;\r\nprint inteiro.toString()\u00a0\r\n\r\n<\/pre>\n<p>Uma maneira f\u00e1cil de se habituar a este detalhe da linguagem consiste em compar\u00e1-la com o autoboxing incluido na linguagem Java a partir da vers\u00e3o 5.<\/p>\n<p><strong>return opcional<\/strong>: a instru\u00e7\u00e3o return com a qual j\u00e1 estamos habituados a trabalhar em Java tamb\u00e9m existe em Groovy. Por\u00e9m, \u00e9 opcional. Dada uma fun\u00e7\u00e3o, o valor de retorno do \u00faltimo comando corresponde ao valor de retorno da mesma, tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nboolean maiorQuetradicional(int a, int b) {\r\n\r\n\u00a0\u00a0 \/\/ a maneira &quot;tradicional&quot; de se trabalhar com Java\r\n\u00a0\u00a0 return a &gt; b\u00a0\r\n\r\n}\r\n\r\nboolean maiorQueGroovy(int a, int b) {\r\n\r\n\u00a0\u00a0 \u00a0 \u00a0a &gt; b \/\/ bem mais simples!\r\n\r\n}\r\n\r\n<\/pre>\n<p><strong>sobrescrita de operadores:<\/strong>\u00a0tal como em C++, em Groovy voc\u00ea tamb\u00e9m pode sobrescrever os operadores b\u00e1sicos da linguagem, como ++, &#8211;, &gt;, etc. (mais sobre isto mais tarde)<\/p>\n<h3>Groovy Beans<\/h3>\n<p>Groovy facilita muito a vida do desenvolvedor quando o assunto consiste em declara\u00e7\u00e3o de beans. Isto porque a linguagem j\u00e1 faz boa parte do trabalho para o desenvolvedor. Voc\u00ea n\u00e3o precisa ficar declarando m\u00e9todos gets e sets: Groovy faz isto din\u00e2micamente para voc\u00ea!<\/p>\n<p>Suponhamos que em Java, voc\u00ea precise implementar um bean tal como descrito abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nclass Pessoa {\r\n\r\n\u00a0\u00a0 \u00a0private String nome;\r\n\u00a0\u00a0 \u00a0private String sobrenome;\r\n\r\n\u00a0\u00a0 \u00a0public String getNome() {return this.nome;}\r\n\u00a0\u00a0 \u00a0public void setNome(String valor) {this.nome = valor;}\r\n\r\n\u00a0\u00a0 \u00a0public String getSobrenome() {return this.sobrenome;}\r\n\u00a0\u00a0 \u00a0public void setSobrenome(String valor) {this.sobrenome = valor;}\u00a0\r\n\r\n}\r\n\r\n<\/pre>\n<p>Em Groovy, voc\u00ea poderia declarar o mesmo bean apenas com o c\u00f3digo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\n\u00a0\r\n\r\nclass Pessoa {\r\n\r\n\u00a0\u00a0 \u00a0String nome;\r\n\u00a0\u00a0 \u00a0String sobrenome;\r\n\r\n}\r\n\r\n\u00a0\r\n\r\n<\/pre>\n<p>Se o escopo de uma vari\u00e1vel \u00e9 indefinido, Groovy entende que dever\u00e1 criar din\u00e2micamente os m\u00e9todos get e set para cada um dos atributos da classe. Sendo assim, boa parte da sua digita\u00e7\u00e3o torna-se desnecess\u00e1ria!<\/p>\n<p>Claro, se quiser pode sobrescrever um get e set para customizar sua classe, tal como no exemplo abaixo:<\/p>\n<p>\u00a0<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\n\u00a0\r\n\r\nclass Pessoa {\r\n\r\n\u00a0\u00a0 \u00a0String nome;\r\n\u00a0\u00a0 \u00a0String sobrenome;\r\n\r\n\u00a0\u00a0 \u00a0public String getNome() {\r\n\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0return &quot;Sempre me chamarei Jos\u00e9!&quot;\r\n\r\n\u00a0\u00a0 \u00a0 }\r\n\r\n}\r\n\r\n\u00a0\r\n\r\n<\/pre>\n<h3>Tipagem din\u00e2mica<\/h3>\n<p>Em Groovy, o tipo das vari\u00e1veis \u00e9 definido opcionalmente. Se quiser, voc\u00ea pode defini-lo tal como faria em Java. Caso contr\u00e1rio, pode passar esta tarefa ao Groovy, que ele se vira pra voc\u00ea, tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\ndef a, b\r\na = 5\r\nb = 6\r\ndef c = a + b \/\/ C ser\u00e1 igual a 11.\u00a0\r\nd = c + a + b \/\/ D ser\u00e1 igual a 22\u00a0\r\n\r\n<\/pre>\n<p>Para definir uma vari\u00e1vel cujo tipo \u00e9 indefinido, usa-se a seguinte sintaxe:<\/p>\n<p><strong>def<\/strong>\u00a0[nome da variavel] [especifica\u00e7\u00e3o do valor opcional]\u00a0<\/p>\n<p>ou, se preferir, simplesmente<\/p>\n<p>[nome da variavel] [especifica\u00e7\u00e3o do valor opcional]<\/p>\n<p>Groovy utiliza duck typing para definir os tipos das vari\u00e1veis. O que \u00e9 duck typing? Simplesmente isto:<br \/>\nse age como um pato, \u00e9 um pato.<\/p>\n<p>No caso do Groovy, se uma vari\u00e1vel age como sendo de determinado tipo (um n\u00famero, uma string, etc.), ent\u00e3o Groovy ir\u00e1 definir o seu tipo din\u00e2micamente desta forma.<\/p>\n<h3>Strings<\/h3>\n<p>Groovy simplifica muito a nossa vida na hora de lidar com strings. As strings com as quais voc\u00ea est\u00e1 a lidar s\u00e3o as mesmas com as quais estava acostumado em Java, por\u00e9m com alguns detalhes a mais:<\/p>\n<p>Para come\u00e7ar, h\u00e1 tr\u00eas maneiras distintas de se declarar strings em Groovy:\u00a0<\/p>\n<p>\u00a0<\/p>\n<ul>\n<li>\u00c1spas simples, como &#8216;sou uma string em aspas simples&#8217;<\/li>\n<li>\u00c1spas duplas, como em &#8220;sou uma string com a qual voc\u00ea j\u00e1 est\u00e1 habituado em Java&#8221;\u00a0<\/li>\n<li>\u00c1spas triplas, como em<br \/>\n&#8220;&#8221;&#8221; sou uma maneira muito mais<br \/>\n\u00a0\u00a0 \u00a0interessante de se lidar com strings que<br \/>\n\u00a0\u00a0 \u00a0ocupem bem mais<br \/>\n\u00a0\u00a0 \u00a0de uma linha&#8221;&#8221;&#8221;<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<p>H\u00e1 uma diferen\u00e7a entre o funcionamento destes tr\u00eas tipos de declara\u00e7\u00e3o: strings com \u00e1spas duplas e triplas permitem o acoplamento de strings, enquanto strings com \u00e1spas simples n\u00e3o. O que nos leva a mais uma \u00fatil novidade que Groovy nos tr\u00e1s:<\/p>\n<p><strong>Acoplamento de strings<\/strong><\/p>\n<p>Em Groovy, voc\u00ea pode incluir o conte\u00fado de uma vari\u00e1vel ou o resultado de uma express\u00e3o dentro de uma string sem usar o operador <strong>+<\/strong>\u00a0com o qual estamos acostumados (e irritados) em Java, tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nint umInteiro = 5\r\n\r\nString aspasDuplas = &quot;Eu gosto do n\u00famero ${umInteiro}&quot;\r\n\r\nString aspasTriplas = &quot;&quot;&quot;Eu gosto muito do n\u00famero ${umNumero},\u00a0\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0mas tamb\u00e9m curto o seu dobro: ${umNumero + umNumero}&quot;&quot;&quot;\u00a0\r\n\r\n<\/pre>\n<p>\u00a0<\/p>\n<p>Como pode ser visto, a sintaxe \u00e9 simples. Basta incluir em uma string dupla ou tripla os caracteres &#8216;${&#8216; seguidos de uma express\u00e3o ou valor e finaliz\u00e1-lo com um &#8216;}&#8217;.<\/p>\n<h3>Closures<\/h3>\n<p>Closures \u00e9 um t\u00f3pico especial, raz\u00e3o pela qual voc\u00ea podera aprender mais sobre Grails neste link (ainda em produ\u00e7\u00e3o).<\/p>\n<h3>Intervalos, hashes e cole\u00e7\u00f5es<\/h3>\n<p>Groovy inclui boa parte das Collections do Java na pr\u00f3pria sintaxe da linguagem. N\u00e3o \u00e9 preciso referenciar o pacote java.util s\u00f3 para usar listas. Groovy j\u00e1 referencia este pacote automaticamente para voc\u00ea e ainda inclui algumas outras novidades tal como descrito abaixo:<\/p>\n<p><strong>Intervalos<\/strong><\/p>\n<p>Intervalos (no Groovy em A\u00e7\u00e3o, s\u00e3o chamadas de escalas, por\u00e9m acredito que o termo &#8220;intervalo&#8221; descreve melhor com o que estamos lidando) consistem em um recurso extremamente \u00fatil na linguagem. Voc\u00ea prov\u00e1velmente \u00e9 familiar ao senhor abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nfor (int i = 0; i &lt; 10; i++) {\r\n\u00a0\u00a0 \u00a0 bla bla bla\u00a0\r\n\r\n}\r\n\r\n&amp;#91;\/code&amp;#93;\r\n\r\nO que temos dentro do loop, na realidade \u00e9 um intervalo, por\u00e9m descrito de uma das maneiras mais horrorosas poss\u00edveis. A quest\u00e3o que fica agora \u00e9: como isto poderia ser melhorado? Veja o c\u00f3digo abaixo:\r\n\r\n&amp;#91;code language=&#039;java&#039;&amp;#93;\r\n\r\nfor (a in 0..9) {\r\n\r\n\u00a0\u00a0 \u00a0bla bla bla\r\n\r\n}\r\n\r\n&amp;#91;\/code&amp;#93;\r\n\r\nEste &lt;strong&gt;0..9&lt;\/strong&gt;\u00a0consiste em uma escala, que implementa a interface Collection do Java. Sendo assim, \u00e9 mais do que sintaxe: \u00e9 um objeto por si s\u00f3. Declarar uma escala \u00e9 bastante simples. Basta usar a sintaxe abaixo:\r\n\r\n&#x5B;limite inferior]..&#x5B;limite superior]\r\n\r\n&quot;..&quot; consiste em um operador de preced\u00eancia baixa, sendo assim \u00e9 uma boa id\u00e9ia sempre definir seus intervalos dentro de par\u00eanteses, tal como (0..9).\r\n\r\nSe quiser, h\u00e1 tamb\u00e9m um outro operador que voc\u00ea pode usar ao definir escalas. O operador &quot;..&amp;lt;&quot;. Neste caso, estamos dizendo que o valor da direita n\u00e3o entra entre os valores da escala. O c\u00f3digo em Java exposto no primeiro exemplo poderia portanto ser reescrito como\r\n\r\n&#x5B;code language=&#039;java&#039;]\r\n\r\nfor (a in 0..&lt;10) {\r\n\r\n\u00a0\u00a0 bla bla bla\r\n\r\n}\r\n\r\n&amp;#91;\/code&amp;#93;\r\n\r\nComo mencionei, intervalos s\u00e3o objetos. Sendo assim, h\u00e1 alguns m\u00e9todos e fun\u00e7\u00f5es que voc\u00ea pode chamar, tal como no exemplo abaixo:\r\n\r\n&amp;#91;code language=&#039;java&#039;&amp;#93;\r\n\r\n(0..10).contains(4) \/\/ Verifica se o intervalo cont\u00e9m o valor 4\r\n\r\n(0..10).each {elemento -&gt;\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0print elemento} \/\/ each executa uma closure (leia o t\u00f3pico sobre closures para maiores detalhes)\u00a0\r\n\r\n<\/pre>\n<p>Escalas s\u00f3 aceitam n\u00fameros? N\u00e3o. Basicamente, aceitam qualquer tipo de objeto pode ser usado desde que as duas condi\u00e7\u00f5es abaixo sejam satisfeitas:<\/p>\n<ul>\n<li>O tipo implementa pr\u00f3ximo e anterior, ou seja, faz override dos operadores ++ e &#8212; (mais sobre sobrescrita de operadores aqui)<br \/>\n(Groovy sobrescreve os operadores ++ e &#8212; em java.util.Date e alguns outros tipos b\u00e1sicos para voc\u00ea)<\/li>\n<li>O tipo implementa a interface java.lang.Comparable<\/li>\n<\/ul>\n<p><strong>Listas<\/strong><\/p>\n<p>Uma lista \u00e9 declarada em Groovy usando a seguinte sintaxe:<\/p>\n<p>[ (uma s\u00e9rie de objetos separdos por v\u00edgula) ].<\/p>\n<p>Exemplo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nlista = &#x5B;&quot;uma&quot;, &quot;lista&quot;, &quot;de&quot;, &quot;strings&quot;]\r\n\r\n\/*\r\n\r\n\u00a0\u00a0 Claro, voc\u00ea ter\u00e1 acesso tamb\u00e9m a todos os m\u00e9todos da interface java.util.List\r\n\r\n*\/\r\n\r\nlista.contains(&quot;uma&quot;)\r\nlista.add(&quot;coisas da vida&quot;)\r\nprint &quot;A lista possui ${lista.size()} itens!&quot;\u00a0\r\n\r\n<\/pre>\n<p>E ainda h\u00e1 alguns operadores bem interessantes para se lidar com listas, tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nlista = &#x5B;]\r\n\/\/ Como incluir um novo item na lista?\r\nlista += &quot;primeiro item&quot;\r\n\/\/ Como incluir mais de um item?\r\nlista += &#x5B;&quot;segundo&quot;, &quot;terceiro&quot;, &quot;quarto&quot;]\r\n\/\/ E como eu removo um item?\r\nlista -= &#x5B;&quot;terceiro&quot;]\u00a0\r\n\r\n<\/pre>\n<p>Resumindo: seu c\u00f3digo ficar\u00e1 beeem mais f\u00e1cil de ser compreendido.<\/p>\n<p><strong>Mapas (hashes)<\/strong><\/p>\n<p>Mapas em Groovy tamb\u00e9m est\u00e3o embutidos direto na sintaxe da linguagem, tal como pode ser visto abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\ndef mapa = &#x5B;&quot;a&quot;:1, &quot;b&quot;:2, &quot;c&quot;:3] \/\/ Defini\u00e7\u00e3o do mapa\r\n\/*\r\n\u00a0\u00a0 \u00a0 A sintaxe \u00e9 simples: dentro dos colchetes, o elemento a esquerda do caractere &quot;:&quot; representa o \u00edndice, e o valor \u00e0 direita, o valor\r\n*\/\u00a0\r\n\r\n\/\/ Claro, todos os m\u00e9todos da interface java.util.Map podem ser chamados aqui, tal como\r\nprintln &quot;Eis que nosso mapa possui ${mapa.size()}&quot;\r\nprintln &quot;E o valor de c \u00e9... ${mapa.get(&quot;e&quot;)}&quot;\r\n\r\n<\/pre>\n<p>Ali\u00e1s, em Groovy, voc\u00ea pode passar mapas para construtores de classes tamb\u00e9m, j\u00e1 as populando, tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nclass Pessoa {\r\n\r\n\u00a0\u00a0 \u00a0String nome\r\n\u00a0\u00a0 \u00a0String descricao\u00a0\r\n\r\n}\r\n\r\nPessoa pessoa = new Pessoa(nome:&quot;Seu nome&quot;, descricao:&quot;Um cara ai&quot;)\r\n\r\n\/*\r\n\u00a0\u00a0 \u00a0O que Groovy faz aqui: ele recebe um hashmap, percorre suas chaves, as compara com os atributos da classe e os preenche.\r\n\u00a0\u00a0 \u00a0Pr\u00e1tico n\u00e3o acha?\r\n\u00a0\u00a0 \u00a0Em apenas uma linha voc\u00ea economiza n!\u00a0\r\n\r\n*\/\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Antes de come\u00e7armos a trabalhar diretamente com Grails, conv\u00e9m conhecer o b\u00e1sico do Groovy. Afinal de contas, \u00e9 a linguagem por tr\u00e1s da ferramenta e, mais do que isto, trata-se tamb\u00e9m de uma linguagem muito interessante para se trabalhar (programadores Java podem ver varios detalhes da linguagem que realmente surpreendem). O que \u00e9 Groovy? No [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3,30,5,1],"tags":[],"class_list":["post-231","post","type-post","status-publish","format-standard","hentry","category-grails","category-grails-guia-rapido-e-indireto","category-groovy","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>B\u00e1sico do Groovy para quem for aprender Grails - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=231\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"B\u00e1sico do Groovy para quem for aprender Grails - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Antes de come\u00e7armos a trabalhar diretamente com Grails, conv\u00e9m conhecer o b\u00e1sico do Groovy. Afinal de contas, \u00e9 a linguagem por tr\u00e1s da ferramenta e, mais do que isto, trata-se tamb\u00e9m de uma linguagem muito interessante para se trabalhar (programadores Java podem ver varios detalhes da linguagem que realmente surpreendem). O que \u00e9 Groovy? No [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=231\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2008-12-30T15:59:56+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2008\/12\/groovylogo.png\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=231\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=231\",\"name\":\"B\u00e1sico do Groovy para quem for aprender Grails - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=231#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=231#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png\",\"datePublished\":\"2008-12-30T15:59:56+00:00\",\"dateModified\":\"2008-12-30T15:59:56+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=231#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=231\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=231#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=231#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"B\u00e1sico do Groovy para quem for aprender Grails\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"B\u00e1sico do Groovy para quem for aprender Grails - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=231","og_locale":"pt_BR","og_type":"article","og_title":"B\u00e1sico do Groovy para quem for aprender Grails - \/dev\/Kico","og_description":"Antes de come\u00e7armos a trabalhar diretamente com Grails, conv\u00e9m conhecer o b\u00e1sico do Groovy. Afinal de contas, \u00e9 a linguagem por tr\u00e1s da ferramenta e, mais do que isto, trata-se tamb\u00e9m de uma linguagem muito interessante para se trabalhar (programadores Java podem ver varios detalhes da linguagem que realmente surpreendem). O que \u00e9 Groovy? No [&hellip;]","og_url":"https:\/\/devkico.itexto.com.br\/?p=231","og_site_name":"\/dev\/Kico","article_published_time":"2008-12-30T15:59:56+00:00","og_image":[{"url":"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2008\/12\/groovylogo.png"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=231","url":"https:\/\/devkico.itexto.com.br\/?p=231","name":"B\u00e1sico do Groovy para quem for aprender Grails - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=231#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=231#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png","datePublished":"2008-12-30T15:59:56+00:00","dateModified":"2008-12-30T15:59:56+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=231#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=231"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=231#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png"},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=231#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"B\u00e1sico do Groovy para quem for aprender Grails"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/231"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=231"}],"version-history":[{"count":6,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/231\/revisions"}],"predecessor-version":[{"id":238,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/231\/revisions\/238"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=231"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}