{"id":976,"date":"2011-09-08T20:16:14","date_gmt":"2011-09-08T23:16:14","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=976"},"modified":"2011-09-08T20:16:14","modified_gmt":"2011-09-08T23:16:14","slug":"groovy-vs-java-listas","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=976","title":{"rendered":"Groovy vs Java: listas"},"content":{"rendered":"<p><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-235\" title=\"groovylogo\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png\" alt=\"\" width=\"203\" height=\"100\" \/><\/a>O erro mais comum de quem est\u00e1 aprendendo Grails \u00e9 programar em Groovy exatamente como seria feito em Java. \u00c9 um comportamento comum, visto que <strong>aparentemente<\/strong> n\u00e3o h\u00e1 tantas diferen\u00e7as sint\u00e1ticas assim entre as duas linguagens. Reparou que coloquei &#8220;aparentemente&#8221; em negrito?<\/p>\n<p>Este post \u00e9 o primeiro de uma s\u00e9rie na qual pretendo comparar as duas linguagens e tentando convenc\u00ea-los a n\u00e3o cometer o pecado de se programar em Groovy como se fosse Java.<\/p>\n<h3>Primeira diferen\u00e7a: as listas est\u00e3o presentes na sintaxe do Groovy<\/h3>\n<p>Em Java\u00a0 para criar uma lista\u00a0 o caminho padr\u00e3o \u00e9 instanciar alguma classe que implemente a interface java.util.List, gerando c\u00f3digo como o abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nList&lt;Tipo&gt; lista = new ArrayList&lt;Tipo&gt;();\r\n\r\n<\/pre>\n<p>Em Groovy temos um elemento sint\u00e1tico s\u00f3 para lidar com listas que s\u00e3o os colchetes. O mesmo c\u00f3digo que escrevi em Java, eu reescreveria em Groovy assim:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\ndef lista = &#x5B;]\r\n\r\n<\/pre>\n<p>A vari\u00e1vel lista armazena agora uma inst\u00e2ncia de java.util.ArrayList. Repare: eu n\u00e3o preciso definir (e nem tenho como usando esta sintaxe) o tipo que esta lista ir\u00e1 armazenar, porque Groovy possui tipagem din\u00e2mica.<\/p>\n<p>E sabe o que \u00e9 mais legal? Eu tamb\u00e9m posso j\u00e1 instanciar minha lista preenchida, tal como nos exemplos abaixo:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\ndef lista_de_strings = &#x5B;&quot;Uma bonita lista&quot;, &quot;com muitas&quot;, &quot;strings&quot;]\r\n\r\ndef lista_ecletica = &#x5B;&quot;Uma string&quot;, 23, true, false, &#x5B;&quot;uma&quot;, &quot;lista&quot;, &quot;interna&quot;]]\r\n\r\n<\/pre>\n<p>Em Java \u00e9 poss\u00edvel instanciar uma lista e ao mesmo tempo j\u00e1 definir o seu conte\u00fado. H\u00e1 duas maneiras de se fazer isto: voc\u00ea pode usar um construtor que receba como par\u00e2metro um objeto que implemente a interface java.util.Collection OU pode usar um c\u00f3digo bem feio usando inner classes. Quer ver? Bem, aqui vai:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nList&lt;String&gt; lista_strings = new ArrayList&lt;String&gt;() {{\r\nadd(&quot;Uma lista&quot;);\r\nadd(&quot;Com c\u00f3digo muito&quot;);\r\nadd(&quot;Feio&quot;);\r\n\r\n}};\r\n\r\n<\/pre>\n<p><strong><span style=\"color: #ff0000;\">ALERTA:<\/span><\/strong> se estiver programando em Groovy exatamente como faz em Java, \u00e9 certo que ao topar com uma lista como as que expus acima voc\u00ea ir\u00e1 acreditar se tratar de um array.<\/p>\n<h3>Acessando elementos<\/h3>\n<p>Como em Java as listas s\u00e3o implementa\u00e7\u00f5es da interface java.util.List, acessar os elementos sempre \u00e9 feito pelo m\u00e9todo get, como no exemplo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nString valor = lista.get(1); \/\/ pego o segundo elemento\r\n\r\n<\/pre>\n<p>Sabe, em Groovy eu posso fazer exatamente como em Java, j\u00e1 que \u00e9 uma inst\u00e2ncia de java.util.ArrayList. E tamb\u00e9m de uma forma mais bacaninha. :)<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\ndef valor = lista&#x5B;1] \/\/ pego o segundo elemento\r\n\r\ndef valor2 = lista.get(1) \/\/ a la Java\r\n\r\n<\/pre>\n<h3>Inserindo e removendo elementos<\/h3>\n<p>Em Java, quando queremos adicionar um elemento em uma lista, usamos o m\u00e9todo add, como no c\u00f3digo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nlista.add(&quot;String quente&quot;);\r\n\r\n<\/pre>\n<p>Em Groovy podemos usar um recurso poderoso que \u00e9 a sobrescrita de operadores. Quer ver como funciona?<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\ndef lista = &#x5B;]\r\n\r\nlista += &quot;Uma string&quot; \/\/ O operador += serve para inserir um elemento na lista\r\n\r\nlista.add(&quot;Uma outra string&quot;) \/\/ a la Java\r\n\r\ndef nova_lista = lista + &quot;Adendo&quot; \/\/ crio uma nova lista, chamada nova_lista, que cont\u00e9m o conteudo de lista + uma String\r\n\r\n<\/pre>\n<p>Resumindo: o operador += inclui elementos na lista, enquanto o operador + cria uma nova lista.<\/p>\n<p>E pra remover voc\u00ea prov\u00e1velmente j\u00e1 sabe tamb\u00e9m:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\ndef lista = &#x5B;&quot;um&quot;, &quot;Monte&quot;, &quot;de&quot;, &quot;strings&quot;]\r\n\r\nlista -= &quot;Monte&quot; \/\/ removo o elemento &quot;Monte&quot;\r\n\r\ndef nova_lista = lista - &quot;de&quot; \/\/ crio uma nova lista que n\u00e3o cont\u00e9m o elemento &quot;de&quot;\r\n\r\n<\/pre>\n<p>Outro resumo: o operador &#8211; remove um elemento, enquanto o operador -= cria uma nova lista que n\u00e3o cont\u00e9m o elemento passado como par\u00e2metro.<\/p>\n<h3>Buscando elementos<\/h3>\n<p>Se em Java voc\u00ea quer retornar todos os elementos de uma lista que satisfa\u00e7am a um crit\u00e9rio, o c\u00f3digo a ser escrito vai ser parecido com isto:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nList&lt;Pessoa&gt; pessoas = new ArrayList&lt;Pessoa&gt;() {{\r\n\r\nadd(new Pessoa(&quot;Kico&quot;, 32);\r\nadd(new Pessoa(&quot;Lol\u00f3&quot;, 29);\r\nadd(new Pessoa(&quot;Theo&quot;, 0);\r\n\r\n}};\r\n\r\nList&lt;Pessoa&gt; pessoas_com_mais_de_um_ano = new ArrayList&lt;Pessoa&gt;();\r\n\r\nfor (Pessoa pessoa : pessoas) {\r\n\r\nif (pessoa.getIdade() &gt; 1) pessoas_com_mais_de_um_ano.add(pessoa);\r\n\r\n}\r\n\r\n<\/pre>\n<p>E em Groovy, como fa\u00e7o hein? Assim:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\ndef pessoas = &#x5B;new Pessoa(&#x5B;nome:&quot;Kico&quot;, idade:32]), new Pessoa(&#x5B;nome:&quot;Lol\u00f3&quot;, idade:29]),\r\nnew Pessoa(&#x5B;nome:&quot;Theo&quot;, idade:0])]\r\n\r\ndef resultado = pessoas.findAll { it.idade &gt; 1 }\r\n\r\n<\/pre>\n<p>Eu uso a fun\u00e7\u00e3o findAll, que recebe como par\u00e2metro uma <a href=\"https:\/\/devkico.itexto.com.br\/?p=241\">closure<\/a>. O papel desta \u00e9 simples: retornou true? Adicione na lista de retorno.<\/p>\n<p>E se eu quiser s\u00f3 o primeiro resultado?<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\ndef resultado = pessoas.find {it.idade &gt; 1}\r\n\r\n<\/pre>\n<p>Vou retornar n\u00e3o uma lista, mas a primeira inst\u00e2ncia que satisfa\u00e7a ao resultado.<\/p>\n<p>Outro problema: como voc\u00ea verifica se pelo menos um objeto em uma lista satisfa\u00e7a a uma condi\u00e7\u00e3o? Em Java, escrevemos um monstrinho como o c\u00f3digo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\npublic boolean existeUmBebe(List&lt;Pessoa&gt; lista) {\r\n\r\nfor (Pessoa pessoa : lista) {\r\n\r\nif (pessoa.getIdade() &lt; 1) return true;\r\n\r\n}\r\n\r\nreturn false;\r\n\r\n}\r\n\r\n<\/pre>\n<p>Wow! E como eu fa\u00e7o em Groovy hein? Eu uso a fun\u00e7\u00e3o any<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\npessoas.any { it.idade &lt; 1 }\r\n\r\n<\/pre>\n<p>A fun\u00e7\u00e3o any, assim como find e findAll s\u00e3o injetadas em todas as listas pelo Groovy, e todas recebem como par\u00e2metro a closure que verifica a condi\u00e7\u00e3o.<\/p>\n<h3>Iterando sobre o conte\u00fado<\/h3>\n<p>Em ambas as linguagens, iteramos sobre o conte\u00fado usando o loop for. At\u00e9 ai, nada demais. A diferen\u00e7a \u00e9 que Groovy injeta em nossas classes um m\u00e9todo chamado each, que recebe como par\u00e2metro uma closure. Ent\u00e3o \u00e9 poss\u00edvel iterar em cima do resultado de uma consulta de forma bastante simples, tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\ndef lista = &#x5B;new Pessoa(&#x5B;nome:&quot;Kico&quot;, idade:32]), new Pessoa(&#x5B;nome:&quot;Lol\u00f3&quot;, idade:29]),\r\nnew Pessoa(&#x5B;nome:&quot;Theo&quot;, idade:0])]\r\n\r\nlista.findAll { it.idade &gt; 0 }.each {\r\nprintln it.nome\r\n}\r\n\r\n<\/pre>\n<p>O par\u00e2metro que a closure recebe \u00e9 o elemento corrente da itera\u00e7\u00e3o.\u00a0 E sabe o que \u00e9 mais legal? A closure n\u00e3o precisa ser passada na hora.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\ndef trabalhe = {pessoa -&gt;\r\n\r\nif (pessoa.idade &gt; 0) { println &quot;T\u00e1 velho!&quot;} else {println &quot;Ta quase velho!&quot;}\r\n\r\n}\r\n\r\npessoas.each trabalhe\r\n\r\n<\/pre>\n<h3>Coletando valores de atributos<\/h3>\n<p>Imagine que no nosso exemplo, precisemos coletar todos os nomes das pessoas presentes em nossa lista. Em Java, escrever\u00edamos algo como o c\u00f3digo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nList&lt;String&gt; nomes = new ArrayList&lt;String&gt;();\r\n\r\nfor (Pessoa pessoa : pessoas) { nomes.add(pessoa.getNome()); }\r\n\r\n<\/pre>\n<p>Em Groovy, usamos a fun\u00e7\u00e3o collect que \u00e9 injetada nas cole\u00e7\u00f5es. Esta recebe como par\u00e2metro uma closure que ser\u00e1 iterada em cima de todos os elementos da lista. O valor de retorno de cada itera\u00e7\u00e3o \u00e9 adicionado a uma lista que \u00e9 o resutlado da fun\u00e7\u00e3o. \u00c9 complicado de descrever, mas vendo o c\u00f3digo fica mais f\u00e1cil. :)<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\ndef nomes = pessoas.collect { it.nome }\r\n\r\n<\/pre>\n<h3>Concluindo<\/h3>\n<p>Eu s\u00f3 arranhei a superf\u00edcie do assunto. O que fica claro \u00e9: com Groovy voc\u00ea escreve muito menos c\u00f3digo.\u00a0 Um ponto importante a ser salientado \u00e9: quando escrevemos c\u00f3digo em Groovy usando a sintaxe do Java estamos dificultando a vida do compilador, que sofrer\u00e1 horrores tentando otimizar o seu c\u00f3digo. H\u00e1 portanto duas consequ\u00eancias neste pecado:<\/p>\n<ul>\n<li>Digita-se bem mais<\/li>\n<li>O c\u00f3digo \u00e9 mais lento<\/li>\n<\/ul>\n<p>Pra finalizar, dois links que ajudam muito quem est\u00e1 aprendendo:<\/p>\n<p>Groovy Console: <a href=\"http:\/\/groovyconsole.appspot.com\/\">http:\/\/groovyconsole.appspot.com\/<\/a> (pra voc\u00ea experimentar c\u00f3digo Groovy online)<\/p>\n<p>Cole\u00e7\u00f5es em Groovy: <a href=\"http:\/\/groovy.codehaus.org\/JN1015-Collections\">http:\/\/groovy.codehaus.org\/JN1015-Collections<\/a> (diversos dos detalhes que n\u00e3o citei est\u00e3o aqui)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>O erro mais comum de quem est\u00e1 aprendendo Grails \u00e9 programar em Groovy exatamente como seria feito em Java. \u00c9 um comportamento comum, visto que aparentemente n\u00e3o h\u00e1 tantas diferen\u00e7as sint\u00e1ticas assim entre as duas linguagens. Reparou que coloquei &#8220;aparentemente&#8221; em negrito? Este post \u00e9 o primeiro de uma s\u00e9rie na qual pretendo comparar as [&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,5,6],"tags":[],"class_list":["post-976","post","type-post","status-publish","format-standard","hentry","category-grails","category-groovy","category-java"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Groovy vs Java: listas - \/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=976\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Groovy vs Java: listas - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"O erro mais comum de quem est\u00e1 aprendendo Grails \u00e9 programar em Groovy exatamente como seria feito em Java. \u00c9 um comportamento comum, visto que aparentemente n\u00e3o h\u00e1 tantas diferen\u00e7as sint\u00e1ticas assim entre as duas linguagens. Reparou que coloquei &#8220;aparentemente&#8221; em negrito? Este post \u00e9 o primeiro de uma s\u00e9rie na qual pretendo comparar as [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=976\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2011-09-08T23:16:14+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=\"7 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=976\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=976\",\"name\":\"Groovy vs Java: listas - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=976#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=976#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png\",\"datePublished\":\"2011-09-08T23:16:14+00:00\",\"dateModified\":\"2011-09-08T23:16:14+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=976#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=976\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=976#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=976#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Groovy vs Java: listas\"}]},{\"@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":"Groovy vs Java: listas - \/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=976","og_locale":"pt_BR","og_type":"article","og_title":"Groovy vs Java: listas - \/dev\/Kico","og_description":"O erro mais comum de quem est\u00e1 aprendendo Grails \u00e9 programar em Groovy exatamente como seria feito em Java. \u00c9 um comportamento comum, visto que aparentemente n\u00e3o h\u00e1 tantas diferen\u00e7as sint\u00e1ticas assim entre as duas linguagens. Reparou que coloquei &#8220;aparentemente&#8221; em negrito? Este post \u00e9 o primeiro de uma s\u00e9rie na qual pretendo comparar as [&hellip;]","og_url":"https:\/\/devkico.itexto.com.br\/?p=976","og_site_name":"\/dev\/Kico","article_published_time":"2011-09-08T23:16:14+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":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=976","url":"https:\/\/devkico.itexto.com.br\/?p=976","name":"Groovy vs Java: listas - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=976#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=976#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png","datePublished":"2011-09-08T23:16:14+00:00","dateModified":"2011-09-08T23:16:14+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=976#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=976"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=976#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=976#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Groovy vs Java: listas"}]},{"@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\/976"}],"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=976"}],"version-history":[{"count":6,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/976\/revisions"}],"predecessor-version":[{"id":982,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/976\/revisions\/982"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=976"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=976"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}