<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Lucas Teixeira &#187; mop</title>
	<atom:link href="http://lucastex.com.br/tag/mop/feed/" rel="self" type="application/rss+xml" />
	<link>http://lucastex.com.br</link>
	<description>@lucastex</description>
	<lastBuildDate>Fri, 07 Jan 2011 12:44:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Maravilhas do Groovy: O método &#8216;collect&#8217; das listas</title>
		<link>http://lucastex.com.br/2009/11/06/maravilhas-do-groovy-o-metodo-collect-das-listas/</link>
		<comments>http://lucastex.com.br/2009/11/06/maravilhas-do-groovy-o-metodo-collect-das-listas/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 00:28:40 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Maravilhas do Groovy]]></category>
		<category><![CDATA[collections]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[mop]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=142</guid>
		<description><![CDATA[

Passei agora pela seguinte situação:
Possuía uma lista de objetos (pogos) com várias propriedades, e a partir desta lista, eu precisaria de uma nova lista com apenas os ids de cada um destes objetos, ao invés da clássica iteração para se resgatar os valores, acabei usando o método collect, que recebe uma closure, e para cada [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2009%252F11%252F06%252Fmaravilhas-do-groovy-o-metodo-collect-das-listas%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Maravilhas%20do%20Groovy%3A%20O%20m%C3%A9todo%20%27collect%27%20das%20listas%22%20%7D);"></div>
<p>Passei agora pela seguinte situação:</p>
<p>Possuía uma lista de objetos (pogos) com várias propriedades, e a partir desta lista, eu precisaria de uma nova lista com apenas os ids de cada um destes objetos, ao invés da clássica iteração para se resgatar os valores, acabei usando o método <strong>collect</strong>, que recebe uma closure, e para cada objeto da lista, aplica esta <a href="http://lucastex.com.br/2009/10/21/nao-tenha-medo-das-closures/" target="_blank">closure</a>!</p>
<p>Para quem conhece, funciona da mesma maneira que o <a href="http://java.sun.com/javase/6/docs/api/java/io/FileFilter.html" target="_blank">FileFilter</a> do Java, que é usado para <a href="http://java.sun.com/javase/6/docs/api/java/io/File.html#listFiles%28java.io.FileFilter%29" target="_blank">filtrar arquivos dentro de um diretório</a>.</p>
<pre class="brush: groovy; title: ;">def listaPogos = ...
def listaIds = listaPogos.collect { pogo -&gt;
   pogo.id
}</pre>
<p>Quer ver funcionando? <a href="http://groovyconsole.appspot.com/?id=36001" target="_blank">Clique aqui</a> para rodar o código no Groovy Web Console</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/11/06/maravilhas-do-groovy-o-metodo-collect-das-listas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Maravilhas do Groovy: A propriedade metaClass</title>
		<link>http://lucastex.com.br/2009/10/25/maravilhas-do-groovy-a-propriedade-metaclass/</link>
		<comments>http://lucastex.com.br/2009/10/25/maravilhas-do-groovy-a-propriedade-metaclass/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 14:55:53 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Maravilhas do Groovy]]></category>
		<category><![CDATA[metaClass]]></category>
		<category><![CDATA[mop]]></category>
		<category><![CDATA[slug]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=70</guid>
		<description><![CDATA[

Uma das facilidades que o groovy também traz, é a possibilidade de adicionar métodos em nossas classes em tempo de execução através da propriedade metaClass dos objetos.
Agora mesmo, eu precisava de um recurso para criar &#8220;slugs&#8221; (essas URLs amigáveis que o WordPress cria) de titulos de artigos. Tradicionalmente, o processo é criar aquelas classes **Utils.java [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2009%252F10%252F25%252Fmaravilhas-do-groovy-a-propriedade-metaclass%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Maravilhas%20do%20Groovy%3A%20A%20propriedade%20metaClass%22%20%7D);"></div>
<p>Uma das facilidades que o groovy também traz, é a possibilidade de adicionar métodos em nossas classes em tempo de execução através da propriedade <strong>metaClass</strong> dos objetos.</p>
<p>Agora mesmo, eu precisava de um recurso para criar &#8220;slugs&#8221; (essas URLs amigáveis que o WordPress cria) de titulos de artigos. Tradicionalmente, o processo é criar aquelas classes **Utils.java com todos os métodos utilitários, mas com a metaprogramação, o mais usual passa a ser adicionar o métodos nas próprias classes que geram este comportamento.</p>
<p>No exemplo abaixo, eu adicionei o método slug() em runtime dentro da classe String e a partir de agora, qualquer objeto da classe java.lang.String possui o método slug(), com o comportamento descrito abaixo.</p>
<pre class="brush: groovy; title: ;">String.metaClass.slug { -&gt;
    def s = delegate.toLowerCase()
    s = s.replaceAll(/[^a-z0-9\s-]/, &quot;&quot;).replaceAll(/\s+/, &quot; &quot;).trim()
    if (s.length() &gt; 45)
        s = s.substring(0, 45).trim()
    s.replaceAll(/\s/, &quot;-&quot;)
 }</pre>
<p>Em primeiro, definimos uma varíavel interna &#8217;s&#8217; com o valor da própria string que está sendo usada (através da propriedade <em>delegate</em>), após isso, aplicamos a primeira regex de caracteres especiais, outra para substituir os espaços em excesso e cortamos a string caso ela tenha mais que 45 caracteres. Por fim, substituímos os espaços por dashes.</p>
<p>Você pode rodar este script <a href="http://groovyconsole.appspot.com/?id=28001" target="_self">neste endereço</a>, basta clicar em &#8220;Execute script&#8221;</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/10/25/maravilhas-do-groovy-a-propriedade-metaclass/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Não tenha medo das closures</title>
		<link>http://lucastex.com.br/2009/10/21/nao-tenha-medo-das-closures/</link>
		<comments>http://lucastex.com.br/2009/10/21/nao-tenha-medo-das-closures/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 13:55:24 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[closure]]></category>
		<category><![CDATA[mop]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=26</guid>
		<description><![CDATA[

Você tem medo das closures? Já vi muita gente dizer que closures são perigosas e trazê-las a tona seria como acordar um monstro adormecido (o medonho GOTO &#8211; veja uma ótima definição neste link).
Não eu não concordo, closures só querem o seu bem, eis a razão.
Bom, uma closure nada mais é que um trecho de [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2009%252F10%252F21%252Fnao-tenha-medo-das-closures%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22N%C3%A3o%20tenha%20medo%20das%20closures%22%20%7D);"></div>
<p>Você tem medo das <a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29">closures</a>? Já vi muita gente dizer que closures são perigosas e trazê-las a tona seria como acordar um monstro adormecido (o medonho <a href="http://i.techrepublic.com.com/blogs/goto.png">GOTO</a> &#8211; veja uma ótima definição neste link).</p>
<p>Não eu não concordo, closures só querem o seu bem, eis a razão.</p>
<p>Bom, uma closure nada mais é que um trecho de código! Mas o que difere este bloco de instruções chamado closure de um método? A grande diferença neste caso, é que as closures são um pouco mais flexíveis que os métodos, e por sua vez podem até ser passadas como parâmetro na chamada de outras funções, ou seja, podem ser atribuídas a uma variável.</p>
<p>Em <a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29">java</a> não temos closures nativas na linguagem, e uma das formas de tentar alcançar o objetivo é através do uso de <a href="http://java.sun.com/docs/books/tutorial/java/javaOO/innerclasses.html">classes anônimas</a>, o que particularmente não me agrada muito, pela sujeira que fica no código.</p>
<p>Em um primeiro exemplo, mais simples, segue como definir uma closure, associá-la a uma variável e depois executá-la. (exemplo em <a href="http://groovy.codehaus.org/">groovy</a>).</p>
<pre class="brush: groovy; title: ;">def c = {
    println &quot;Testando o uso de uma closure&quot;
}
c.call()</pre>
<p>Este é um exemplo simples, onde a frase acima será impressa no console.</p>
<p>Para incrementarmos um pouco, podemos fazer com que nossa closure receba um parâmetro para usá-lo dentro da execução, além de criar um método que faça o uso dela. O exemplo abaixo mostra isto.</p>
<pre class="brush: groovy; title: ;">//definição da closure para dizer oi
def ola = { nome -&gt;
    println &quot;E ai ${nome}, tudo bom?&quot;
}

//definição da closure para dizer tchau
def tchau = { nome -&gt;
    println &quot;To indo ${nome}, ate a proxima!&quot;
}

//criação do método que fará o uso da closure
void falar(Closure c, String paraQuem) {
    c.call(paraQuem)
}

//invoke do método com as closures de parametro
//note que a closure é passada como se fosse uma variável qualquer
falar(ola, &quot;Fulano&quot;)
falar(tchau, &quot;Ciclano&quot;)</pre>
<p>Mas uma das maiores vantagens que eu enxergo nas closures, é a possibilidade de definição delas em runtime. Isso mesmo, conforme você programa, pode criar uma nova closure e chamar uma função que precise dela! Vemos isso em ruby e groovy com frequência para métodos onde iteramos listas e mapas.</p>
<p>Por exemplo, as listas e arrays em groovy possuem um método each que recebe uma closure como parâmetro, esta closure define o que será feito com cada um dos items da lista/array em questão. O exemplo abaixo mostra a praticidade de se fazer a definição da closure inline, ou seja, sem criar uma variável para ela antes.</p>
<p>Em groovy</p>
<pre class="brush: groovy; title: ;">//groovy
def lista = [&quot;Ferrari&quot;, &quot;RBR&quot;, &quot;STR&quot;, &quot;Brawn&quot;, &quot;Renault&quot;, &quot;Williams&quot;]
lista.each { equipe -&gt;
    println &quot;A equipe ${equipe} correu na #F1 em 2009&quot;
}</pre>
<p>Em ruby</p>
<pre class="brush: ruby; title: ;">
#ruby
lista = [&quot;Ferrari&quot;, &quot;RBR&quot;, &quot;STR&quot;, &quot;Brawn&quot;, &quot;Renault&quot;, &quot;Williams&quot;]
lista.each { |equipe|
    puts &quot;A equipe #{equipe} correu na #F1 em 2009&quot;
}
</pre>
<p>Em scala</p>
<pre class="brush: scala; title: ;">//scala
val teams = List(&quot;Ferrari&quot;, &quot;RBR&quot;, &quot;STR&quot;, &quot;Brawn&quot;, &quot;Renault&quot;, &quot;Williams&quot;)
teams foreach {
   team =&gt; printf(&quot;A equipe %s correu na #F1 em 2009&quot;, team)
}
</pre>
<p>Dá pra perceber que a closure foi criada já no momento em que ela foi usada. Desta maneira, além de fácil, um código muito mais limpo e fácil de ser entendido.</p>
<p>Acredite, closures são suas amigas, e estão aqui pra te ajudar, então aproveite!</p>
<p>Ahh, e fica a dica de sempre: Ler a documentação:</p>
<p>Closures em Groovy <a href="http://groovy.codehaus.org/Closures" target="_blank">(wiki)</a> <a href="http://groovy.codehaus.org/api/groovy/lang/Closure.html">(groovydoc)</a> <a href="http://groovy.codehaus.org/Closures+-+Formal+Definition" target="_blank">(definição formal)</a><br />
Closures (Proc) em Ruby <a href="http://www.ruby-doc.org/core/classes/Proc.html" target="_blank">(doc)</a> <a href="http://c2.com/cgi/wiki?BlocksInRuby" target="_blank">(wiki)</a><br />
Closures em Scala <a href="http://www.scala-lang.org/node/138" target="_blank">(wiki)</a></p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/10/21/nao-tenha-medo-das-closures/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

