<?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>Gilliard Cordeiro &#187; Scala</title>
	<atom:link href="http://blog.gilliard.eti.br/tag/scala/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gilliard.eti.br</link>
	<description>tá nervoso? vai programar!</description>
	<lastBuildDate>Wed, 21 Sep 2011 05:22:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Será que o Java 7/8 faz falta mesmo?</title>
		<link>http://blog.gilliard.eti.br/2010/12/sera-que-o-java-7-8-faz-falta-mesmo/</link>
		<comments>http://blog.gilliard.eti.br/2010/12/sera-que-o-java-7-8-faz-falta-mesmo/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 04:01:37 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[Automatic Resource Management]]></category>
		<category><![CDATA[closures]]></category>
		<category><![CDATA[Java 7]]></category>
		<category><![CDATA[Java 8]]></category>
		<category><![CDATA[Project Coin]]></category>
		<category><![CDATA[properties]]></category>

		<guid isPermaLink="false">http://blog.gilliard.eti.br/?p=309</guid>
		<description><![CDATA[Antes de mais nada sei que um ou outro pode querer me xingar sem nem ler o post. Esse post não serve para dizer que eu não quero que o Java evolua, que saiam novas versões, etc. Óbvio que isso é importante e por isso não vou nem discutir isso. Mas o ponto é: tem [...]]]></description>
			<content:encoded><![CDATA[<p>Antes de mais nada sei que um ou outro pode querer me xingar sem nem ler o post. Esse post não serve para dizer que eu não quero que o Java evolua, que saiam novas versões, etc. Óbvio que isso é importante e por isso não vou nem discutir isso. Mas o ponto é: tem motivos para eu ficar <del datetime="2010-11-26T00:19:53+00:00">choramingando</del> lamentando a falta de recursos da <strong>linguagem</strong>, sem olhar para o que é mais importante, que é a <strong>plataforma</strong>? Ficar pensando porque essas mudanças nunca saem em vez de usar o que já temos hoje? A minha resposta pessoal é não, e o intuito deste post é explicar o porquê.</p>
<p>E porque eu coloquei Java 7 e 8 numa tacada só? Bom, talvez você não tenha acompanhado a <a href="http://slashdot.org/story/10/11/22/2329217/The-Details-of-Oracles-JDK-7-and-8-Plan-B">novela da estratégia da Oracle para o Java 7</a>. Resumindo, em vez de fazer um Java 7 pela metade &#8220;agora&#8221; ou um Java 7 completo para sabe-se lá quando, optou-se por fazer um &#8220;Java 7&#8243; em duas fazes. Uma primeira que será o 7 e não vai ter muitas das coisas complicadas de implementar, e a segunda será o 8 e aí sim vai ter tudo que era esperado para o 7. Bem melhor do que demorar tudo que já demorou até hoje e ainda fazer &#8220;de qualquer jeito&#8221;.</p>
<p>Mas o artigo não é sobre Java 7/8 (vou tratar como uma única versão mesmo), e sim sobre a gente precisar ou não desesperadamente da nova versão da <strong>linguagem</strong>, e não das evoluções na <strong>plataforma</strong>. O que vou mostrar é que praticamente tudo que esperamos da próxima versão do Java (linguagem) já temos pronto em outras duas das principais linguagens para a JVM: Groovy e Scala.</p>
<p>Para esse artigo não ficar muito longo vou assumir que você está familiarizado com o fato da plataforma Java ser mais do que a linguagem Java. Mas já deixo na gaveta um post sobre a plataforma para deixar isso mais claro depois. </p>
<p>Além disso meu objetivo aqui não é escrever um post que explique em detalhes cada uma das funcionalidades citadas em cada uma das linguagens, e sim mostrar rapidamente cada coisa. Sendo assim reservo-me o direito de citar referências externas em vez de criar código de exemplo próprio <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><br/><br/></p>
<h2>Geral</h2>
<p>Para as próximas versões do Java existe o projeto <a href="http://openjdk.java.net/projects/coin/">Coin</a> que reúne diversas melhorias para as próximas versões da linguagem. Algumas dessas mudanças estão contempladas nos tópicos abaixo. </p>
<p>Mas o fato é que o objetivo do Java não é ser uma linguagem como Groovy ou Ruby que tem diversas facilidades como <a href="http://groovy.codehaus.org/Operators#Operators-ElvisOperator%28%3F%3A%29">elvis operator</a>, <a href="http://groovy.codehaus.org/Operators#Operators-SafeNavigationOperator%28%3F.%29">safe navigation</a>, reflection super facilitado, invocação do método <code><em>equals</em></code> usando <code><em>==</em></code> entre dezenas de outras coisas.</p>
<p>Talvez o mais parecido com Java seja Scala. Não em sintaxe, pois nesse quisito Groovy é quase igual Java. Agora o que Scala tem de mais parecido é o fato de ser estaticamente tipada, mas com um sintaxe simplificada, com alto poder inferência de tipos, sem ponto e vírgula obrigatório e que você na maioria das vezes nem percebe que não está usando uma linguagem dita mais &#8220;flexível&#8221; ou &#8220;dinâmica&#8221;. </p>
<p>Na minha opinião a maioria não quer especificar tipos, mas isso não quer dizer que necessariamente quer uma linguagem sem tipos. Nos artigos que escrevi de <a href="http://blog.gilliard.eti.br/category/scala/">Scala</a> dá pra ver bem dessas facilidades.</p>
<p><br/><br/></p>
<h2>Closures</h2>
<p>Um dos principais pontos, ou pelo menos o &#8220;mais famoso&#8221; ponto do Java 7 é o suporte à closures. Suporte que esse que durante a novela Java 7 já foi cortado, reintroduzido &#8220;nas coxas&#8221; e por fim vai estar completo no Java 8. Mas e se olharmos para Groovy e Scala? O suporte à closures está lá.</p>
<h5>Java 8</h5>
<p><a href="http://cr.openjdk.java.net/~mr/lambda/straw-man">Referência</a></p>
<pre class="brush: java; title: ; notranslate">
#int() fortyTwo = #()(42);
#int(int) doubler = #(int x)(x + x);
#int(int,int) multiplier = #(int x, int y)(x * y);

assert fortyTwo() == 42;
assert doubler(fortyTwo()) == 84;
assert multiplier(3, fortyTwo()) == 126;
</pre>
<p><strong>Update:</strong> o Paulo Silveira, há um bom tempo já, postou um material bem bacana em português sobre isso no <a href="http://blog.caelum.com.br/trabalhando-com-closures-no-java-8/">blog da Caelum</a>.</p>
<h5>Groovy</h5>
<p><a href="http://groovy.codehaus.org/Closures">Referência</a></p>
<pre class="brush: groovy; title: ; notranslate">
def printSum = { a, b -&gt; print a+b }
printSum( 5, 7 )                       //prints &quot;12&quot;
</pre>
<p><a href="http://groovy.codehaus.org/Closures+-+Formal+Definition">Referência</a></p>
<pre class="brush: groovy; title: ; notranslate">
def c = { arg1, arg2-&gt; println &quot;${arg1} ${arg2}&quot; }
def d = c.curry(&quot;foo&quot;)
d(&quot;bar&quot;)
</pre>
<p><a href="http://groovy.codehaus.org/Closures+-+Informal+Guide">Referência</a></p>
<pre class="brush: groovy; title: ; notranslate">
def x = 2

// define closure and assign it to variable 'c'
def c = { numberToSquare -&gt; numberToSquare * numberToSquare }

// using 'c' as the identifer for the closure, make a call on that closure
def y = c(x)       // shorthand form for applying closure, y will equal 4
def z = c.call(x)  // longhand form, z will equal 4
</pre>
<p><strong>Scala</strong></p>
<p>Esse código de exemplo eu postei <a href="http://blog.gilliard.eti.br/2008/09/scalando-parte-2/">aqui</a> (to meio sem criatividade hoje <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ). Nele temos um método chamado <code>percorreLista</code> e uma closure chamada <code>imprimeElemento</code>, que é passada como parâmetro para o primeiro.</p>
<pre class="brush: scala; title: ; notranslate">
object Main extends Application {
    def percorreLista[T](lista:List[T], funcao:(T) =&gt; Unit)= {
    for (elemento &lt;- lista) {
      funcao(elemento)
    }
  }

  val imprimeElemento = (elemento: Any) =&gt; {
    println(elemento)
  }

  percorreLista(List(2,3,4,5), imprimeElemento)
}
</pre>
<p><br/><br/></p>
<h2>Automatic Resource Management (ARM)</h2>
<p>Uma coisa chata de fazer em Java é trabalhar com IO. Vamos pegar como exemplo&#8230;</p>
<h5>Java 6</h5>
<p>Referências <a href="http://www.java7developer.com/blog/?p=24">um</a> e <a href="http://www.infoq.com/news/2010/08/arm-blocks">dois</a></p>
<p>Aqui temos que tratar as possíveis exceções todas na mão.</p>
<p>Lendo um arquivo</p>
<pre class="brush: java; title: ; notranslate">
try
{
    String teamMember;
    FileReader fr = new FileReader(&quot;arquivo.txt&quot;);
    BufferedReader br = new BufferedReader(fr);
    while ((teamMember = br.readLine()) != null)
    {
        System.out.println(teamMember);
    }
}
catch (FileNotFoundException e)
{
    e.printStackTrace();
}
catch (IOException e)
{
    e.printStackTrace();
}
finally
{
    if (br!= null)
    {
        br.close();
        if (fr != null)
        {
            fr.close();
        }
    }
}
</pre>
<p>Agora um código JDBC</p>
<pre class="brush: java; title: ; notranslate">
String connectionURL = &quot;jdbc:mysql://localhost:3306/myDB&quot;;
Connection connection = null;
Statement st = null;
ResultSet rs = null;
try
{
    connection = DriverManager.getConnection(connectionURL, &quot;root&quot;, &quot;admin&quot;);
    st = connection.createStatement();
    rs = st.executeQuery(&quot;Select * from EMPLOYEE_SALARIES&quot;);
    while (rs.next())
    {
        System.out.println(&quot;EMPLOYEE_NAME/EMPLOYEE_SALARY&quot;);
        System.out.println(rs.getString(1) + &quot;/&quot; + rs.getString(2));
    }
}
catch (ClassNotFoundException ex)
{
    ex.printStackTrace();
}
catch (SQLException ex)
{
    ex.printStackTrace();
}
catch (InstantiationException ex)
{
    ex.printStackTrace();
}
catch (IllegalAccessException ex)
{
    ex.printStackTrace();
}
finally
{
    try
    {
        if (!rs.isClosed())
        {
            rs.close();
        }
        if (!st.isClosed())
        {
            st.close();
        }
        if (!connection.isClosed())
        {
            connection.close();
        }
    }
    catch (SQLException ex)
    {
        ex.printStackTrace();
    }
}
</pre>
<h5>Java 8</h5>
<p>Com o ARM ficaria bem mais simples.</p>
<p>Lendo um arquivo</p>
<pre class="brush: java; title: ; notranslate">
String teamMember = null;
try (BufferedReader br = new BufferedReader(new FileReader(&quot;arquivo.txt&quot;)))
{
    while ((teamMember = br.readLine()) != null)
    {
        System.out.println(teamMember);
    }
}
</pre>
<p>Código JDBC com ARM</p>
<pre class="brush: java; title: ; notranslate">
String connectionURL = &quot;jdbc:mysql://localhost:3306/myDB&quot;;
try
(
    Connection connection = DriverManager.getConnection(connectionURL, &quot;root&quot;, &quot;admin&quot;);
    Statement st = connection.createStatement();
    ResultSet rs = st.executeQuery(&quot;Select * from EMPLOYEE_SALARIES&quot;);
)
{
    while (rs.next())
    {
        System.out.println(&quot;EMPLOYEE_NAME/EMPLOYEE_SALARY&quot;);
        System.out.println(rs.getString(1) + &quot;/&quot; + rs.getString(2));
    }
}
</pre>
<h5>Groovy</h5>
<p>Em Groovy fazer isso é extremamente simples</p>
<p>Lendo um arquivo</p>
<p><a href="http://docs.codehaus.org/display/GROOVY/JN2015-Files">Referência</a></p>
<pre class="brush: groovy; title: ; notranslate">
println new File('arquivo.txt').text
</pre>
<p>Lendo uma tabela com Groovy</p>
<p><a href="http://docs.codehaus.org/display/GROOVY/Tutorial+6+-+Groovy+SQL">Referência</a></p>
<pre class="brush: groovy; title: ; notranslate">
import groovy.sql.Sql
sql = Sql.newInstance(&quot;jdbc:jtds:sqlserver://serverName/dbName-CLASS;domain=domainName&quot;, &quot;username&quot;,
                     &quot;password&quot;, &quot;net.sourceforge.jtds.jdbc.Driver&quot;)
sql.eachRow(&quot;select * from tableName&quot;, { println it.id + &quot; -- ${it.firstName} --&quot;} );
</pre>
<h5>Scala</h5>
<p>Referências <a href="http://stackoverflow.com/questions/2207425/what-automatic-resource-management-alternatives-exists-for-scala">um</a> e <a href="http://polyglot-window.blogspot.com/2009/03/arm-blocks-in-scala-revisited.html">dois</a></p>
<p>Em Scala também é simples.</p>
<pre class="brush: scala; title: ; notranslate">
def using[T &lt;: { def close() }]
    (resource: T)
    (block: T =&gt; Unit)
{
  try {
    block(resource)
  } finally {
    if (resource != null) resource.close()
  }
}

using(new BufferedReader(new FileReader(&quot;file.txt&quot;))) { r =&gt;
  var count = 0
  while (r.readLine != null) count += 1
  println(count)
}
</pre>
<p><a href="http://github.com/jsuereth/scala-arm">Referência</a></p>
<pre class="brush: scala; title: ; notranslate">
val lines = for { file &lt;- managed(new java.io.File(&quot;some.txt&quot;))
       stream &lt;- new java.io.FileInputStream(file)
       line &lt;- makeLineIterator(stream) } yield line
</pre>
<p><br/><br/></p>
<h2>Switch com String?</h2>
<p>Sinceramente eu acho essa parte até meio brincadeira, pois é muito barulho para uma funcionalidade muito simples. Essa mudança faz parte do projeto <a href="http://openjdk.java.net/projects/coin/">Coin</a>.</p>
<h5>Java 7</h5>
<p>A funcionalidade é simples, a única diferença é que agora suporta String.</p>
<h5>Groovy</h5>
<p>O suporte do Groovy é bem mais rico que o suporte à Strings. Claro que pode ser mais complicado num primeiro momento, cheio de possibilidades, mas para mim é só um comportamento mais completo, com tudo que se espera.</p>
<p><a href="http://docs.codehaus.org/display/GROOVY/Logical+Branching">Referência</a></p>
<pre class="brush: groovy; title: ; notranslate">
def x = 1.23
def result = &quot;&quot;

switch ( x ) {
    case &quot;foo&quot;:
        result = &quot;found foo&quot;
        // lets fall through

    case &quot;bar&quot;:
        result += &quot;bar&quot;

    case [4, 5, 6, 'inList']:
        result = &quot;list&quot;
        break

    case 12..30:
        result = &quot;range&quot;
        break

    case Integer:
        result = &quot;integer&quot;
        break

    case Number:
        result = &quot;number&quot;
        break

    default:
        result = &quot;default&quot;
}

assert result == &quot;number&quot;
</pre>
<p>E podemos ainda sobrescrever o método isCase(valor), que por default chama equals(valor)</p>
<pre class="brush: groovy; title: ; notranslate">
class Estado{
    String uf
    def isCase(valor){
        uf == valor
    }
}

def estado = new Estado(uf: &quot;MS&quot;)

switch ( estado ) {
    case &quot;MS&quot;:
        println &quot;Mato Grosso do Sul&quot;
        break

    case &quot;SP&quot;:
        println &quot;São Paulo&quot;
        break

    default:
        println &quot;Sei lá...&quot;
}
</pre>
<h5>Scala</h5>
<p>Scala assim como Groovy tem um mecanismo bem interessante que pode ser usado num switch, o Pattern Matching. Como isso vale um artigo a parte, recomendo a leitura <a href="http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-4">desse post</a>. Mas para exemplificar vou colocar um exemplo:</p>
<pre class="brush: scala; title: ; notranslate">
def checkPrime(number:Int) = number match {
  case 1 =&gt; true
  case 2 =&gt; true
  case 3 =&gt; true
  case 5 =&gt; true
  case 7 =&gt; true

  case _ =&gt; false
}
</pre>
<p>Comparando pelo tipo</p>
<pre class="brush: scala; title: ; notranslate">
var obj = performOperation()
var cast:Color = obj match {
  case x:Color =&gt; x
  case _ =&gt; null
}
</pre>
<p>Em <strong>Java</strong> o equivalente seria</p>
<pre class="brush: java; title: ; notranslate">
Object obj = performOperation();
Color cast = null;
if (obj instanceof Color) {
    cast = (Color) obj;
}
</pre>
<p>E em Scala temos ainda as case classes, que são tipos especiais de classes, que dentro outras coisas não precisamos de new para instanciá-las e podem ser usadas direto com pattern matching.</p>
<p><a href="http://www.scala-lang.org/node/107">Referência</a></p>
<pre class="brush: scala; title: ; notranslate">
case class Number(value:Int)

def checkPrime(n:Number) = n match {
  case Number(1) =&gt; true
  case Number(2) =&gt; true
  case Number(3) =&gt; true
  case Number(5) =&gt; true
  case Number(7) =&gt; true
  case Number(_) =&gt; false
}

checkPrime(Number(12))
</pre>
<p>Outro exemplo</p>
<pre class="brush: scala; title: ; notranslate">
class Color(val red:Int, val green:Int, val blue:Int)

case class Red(r:Int) extends Color(r, 0, 0)
case class Green(g:Int) extends Color(0, g, 0)
case class Blue(b:Int) extends Color(0, 0, b)

def printColor(c:Color) = c match {
  case Red(v) =&gt; println(&quot;Red: &quot; + v)
  case Green(v) =&gt; println(&quot;Green: &quot; + v)
  case Blue(v) =&gt; println(&quot;Blue: &quot; + v)

  case col:Color =&gt; {
    print(&quot;R: &quot; + col.red + &quot;, &quot;)
    print(&quot;G: &quot; + col.green + &quot;, &quot;)
    println(&quot;B: &quot; + col.blue)
  }

  case null =&gt; println(&quot;Invalid color&quot;)
}

printColor(Red(100))
printColor(Blue(220))

printColor(new Color(100, 200, 50))
printColor(null)
</pre>
<p>Saída</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Red: 100
Blue: 220
R: 100, G: 200, B: 50
Invalid color</pre></div></div>

<p><br/><br/></p>
<h2>Properties</h2>
<p>Suporte à properties é bem esperado mas já foi praticamente &#8220;limado&#8221; da lista de features que vão entrar nas próximas versões de Java. Na verdade o suporte à properties é mais do que vamos ver aqui. Um suporte completo permitiria a gente ter type safe criteria na JPA2 sem necessidade de geração de código. Mas com certeza esse suportezinho simples, à la Groovy, já ajuda bastante.</p>
<h5>Java</h5>
<p>Sem suporte. Getters and Setters</p>
<pre class="brush: java; title: ; notranslate">
public class Pessoa{
  private String nome;
  private String endereco;
  private String nome;

  //getters e setterss gerados pela IDE.
  //Vocês já devem estar enjoados de ver, então vou economizar espaço e nem colocar esse código aqui
</pre>
<h5>Groovy</h5>
<p>Em Groovy fazer isso é extremamente simples. O compilador gera altomaticamente os getters e setters para atributos não privados. Depois de compilado fica igualzinho um &#8220;bean&#8221; java, atributos privados e métodos de acesso públicos.</p>
<pre class="brush: groovy; title: ; notranslate">
class Pessoa{
  String nome
  String endereco

  //para essa propriedade não teremos getters e setters gerados
  private Integer idade

  //aqui fica igual os getters e setters gerados para nome e endereco.
  //Só lembrando que a tipagem em groovy é opcional
  def Integer getIdade(){ idade }
  def void setIdade(Integer idade){ this.idade = idade }
}
</pre>
<h5>Scala</h5>
<p>Em Scala também é simples.</p>
<pre class="brush: scala; title: ; notranslate">
class Pessoa(var nome:String,
             var localidade:String,
             private var _idade:Int) {
  //assim como no exemplo em Groovy, quando marcamos um atributo como privado os métodos de acesso não são gerados
  def idade = _idade
  def idade_=(idade:Int) = _idade = idade
}

val pessoa = new Pessoa(&quot;Gilliard&quot;, &quot;Campo Grande/MS&quot;, 26)
pessoa.nome = &quot;Gilliard Cordeiro&quot;
pessoa.idade = 27
println( pessoa.localidade )
</pre>
<p><br/><br/></p>
<h2>Performance</h2>
<p>Tem mais um monte de coisas que eu poderia comentar mas essas são as primeiras que me ocorreram. Mas para finalizar, pelo menos por enquanto, vamos falar de performance.</p>
<p>Não encontrei nenhum benchmark atualizado para linkar aqui, mas no geral Java e Scala estão bem próximos em performance, com mais vantagem para o Java e em alguns casos Scala na frente. Já o Groovy é meio patinho feio nessa comparação entre as três linguagens, mas ainda assim &#8211; com base em benchmarks um pouco antigos &#8211; ele ainda é mais performático que PHP por exemplo. E eu nunca ouvi ninguém dizer que deixaria de usar PHP por causa de performance, mas quando se fala de Groovy esse assunto sempre surge.</p>
<p>Sobre Java e Scala nem vale muito a pena falar, mas os benchmarks envolvendo Groovy tem que ser encarados com cautela. Primeiro porque se o benchmark for meio antigo é bem possível que de lá pra cá a performance já melhorou bastante. Até porque quanto mais lento, mais espaço para melhorar um ambiente de execução tem. O segundo ponto é que em todos os comparativos sempre vejo código 100% linguagem A contra código 100% linguagem B. Já na prática dificilmente a gente vai ter uma aplicação com código 100% Groovy. Vamos pegar como exemplo uma aplicação feita em Grails. Minha bola de cristal diz que no total de código da aplicação (bibliotecas incluídas) nem 30% é Groovy.</p>
<p>Para complicar ainda mais a conta, você já viu o tamanho da StackTrace quando executamos nosso código num servidor de aplicações? O tanto de AOP, interceptors e outros serviços rodando ao mesmo tempo com certeza vai levar mais tempo do que a diferença entre a execução de duas linguagens diferentes. Por fim a maioria dos problemas de performance não é culpa do que se usa, e sim de como se usa uma ferramenta.</p>
<p><strong>Update:</strong> Só mais uma &#8220;coisinha&#8221; sobre performance do Groovy. Existe também o <a href="http://code.google.com/p/groovypptest/wiki/Welcome">Groovy++</a>, que compila estaticamente partes do código Groovy (<a href="http://code.google.com/p/groovypptest/wiki/HowDoesItWork">depende do que você anotar com @Typed</a>) aumentando assim a performance consideravelmente pelo que li, mas não conheço na prática. Quando eu já tiver mexido com isso eu posto, mas até lá vocês podem ver alguma coisa <a href="http://groovy.dzone.com/articles/how-come-groovy-overperform">aqui</a>, <a href="http://groovy.dzone.com/articles/sneak-peak-groovy-what-it-why">aqui</a> e <a href="http://stronglytypedblog.blogspot.com/2010/02/java-vs-scala-vs-groovy-vs-groovy.html">aqui</a>.</p>
<p><br/><br/></p>
<h2>(Minha) Conclusão</h2>
<p>Terminado então esse post, acho que ficou claro que, pelo menos para mim, sentimos falta de um ou outro recurso da linguagem mas, ou praticamente não vamos usar a função quando ela sair (pois não faz falta de verdade hoje), ou não conhecemos as outras opções que a <strong>plataforma</strong>, e não a linguagem Java nos dá. Pois se conhecermos as opções e realmente quisermos usar essas funcionalidades, não faz muito sentido não usar o que se tem.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2010/12/sera-que-o-java-7-8-faz-falta-mesmo/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Scala: Implicit Converters</title>
		<link>http://blog.gilliard.eti.br/2008/09/scala-implicit-converters/</link>
		<comments>http://blog.gilliard.eti.br/2008/09/scala-implicit-converters/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 01:27:21 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[Scala]]></category>
		<category><![CDATA[Linguagem JVM]]></category>

		<guid isPermaLink="false">http://blog.gilliard.eti.br/?p=61</guid>
		<description><![CDATA[No post anterior entre outras coisas, comentei de implicit arguments, agora vou comentar um pouco de implicit converters. Implicit Converters Outra funcionalidade para os implicits são os conversores implicitos. Essa funcionalidade permite adicionarmos características super dinamicas mas sem deixar que fiquemos com a sensação de não sabermos de onde vem as coisas. O que o [...]]]></description>
			<content:encoded><![CDATA[<p>No <a href="http://blog.gilliard.eti.br/2008/09/scalando-parte-2/">post anterior</a> entre outras coisas, comentei de implicit arguments, agora vou comentar um pouco de implicit converters.</p>
<p><strong>Implicit Converters</strong></p>
<p>Outra funcionalidade para os implicits são os conversores implicitos. Essa funcionalidade permite adicionarmos características super dinamicas mas sem deixar que fiquemos com a sensação de não sabermos de onde vem as coisas. O que o compilador do Scala faz é olhar se estamos tentando usar um objeto de um determinado tipo como se fosse de um outro tipo, e então procura uma função que converta um objeto do primeiro tipo para o último.</p>
<p>Por exemplo</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">class</span> Vaca <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">def</span> mugir<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #6666FF;">&quot;muuuuuuu&quot;</span>
<span style="color: #F78811;">&#125;</span>
<span style="color: #008000; font-style: italic;">//...</span>
<span style="color: #0000ff; font-weight: bold;">class</span> Cachorro <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">def</span> latir<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #6666FF;">&quot;au!&quot;</span>
<span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #008000; font-style: italic;">//...</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">var</span> mimosa <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">new</span> Vaca
&nbsp;
<span style="color: #0000ff; font-weight: bold;">def</span> passearComCachorro<span style="color: #F78811;">&#40;</span>toto<span style="color: #000080;">:</span> Cachorro<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
    toto.<span style="color: #000000;">latir</span><span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span>
<span style="color: #F78811;">&#125;</span>
&nbsp;
passearComCachorro<span style="color: #F78811;">&#40;</span>mimosa<span style="color: #F78811;">&#41;</span> <span style="color: #008000; font-style: italic;">// isso vai dar erro?!</span>
&nbsp;
<span style="color: #008000; font-style: italic;">//a não ser que eu tenha algo assim</span>
<span style="color: #0000ff; font-weight: bold;">class</span> Vacachorro<span style="color: #F78811;">&#40;</span>vaca<span style="color: #000080;">:</span> Vaca<span style="color: #F78811;">&#41;</span> <span style="color: #0000ff; font-weight: bold;">extends</span> Cachorro <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">override</span> <span style="color: #0000ff; font-weight: bold;">def</span> latir<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #6666FF;">&quot;Antes eu fazia &quot;</span> + vaca.<span style="color: #000000;">mugir</span><span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span> + <span style="color: #6666FF;">&quot;, mas agora eu sei latir!&quot;</span>
<span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #008000; font-style: italic;">//e esse método converte</span>
<span style="color: #0000ff; font-weight: bold;">implicit</span> <span style="color: #0000ff; font-weight: bold;">def</span> funcaoQueConverteVacaEmCachorro<span style="color: #F78811;">&#40;</span>vaca<span style="color: #000080;">:</span> Vaca<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">new</span> Vacachorro<span style="color: #F78811;">&#40;</span>vaca<span style="color: #F78811;">&#41;</span></pre></td></tr></table></div>

<p>Esse código parece bem esquisito mas funciona. Eu dei um exemplo bem esdrúxulo apenas para mostrar a possibilidade que o Scala dá. Obviamente os conversores geralmente são usados para converter um tipo numérico em outro, ou coisas do genero, mas dei um exemplo pouco convencional propositalmente.<br />
Na linha 17 o compilador do Scala procura por uma função que receba uma Vaca e devolva um Cachorro, porque é o tipo de conversão que ele percebe que precisa acontecer. Entao o compilador faz algo assim:</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;">passearComCachorro<span style="color: #F78811;">&#40;</span>funcaoQueConverteVacaEmCachorro<span style="color: #F78811;">&#40;</span>mimosa<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span></pre></div></div>

<p>Agora caso o compilador não encontrasse nenhuma, ou mais de uma função desse tipo, ele daria erro de compilação.<br />
Mas fora converter ao chamar uma função, o Scala permite também fazer isso:</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;">mimosa.<span style="color: #000000;">latir</span><span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span></pre></div></div>

<p>Que em tempo de compilação o Scala vai transformar em</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;">funcaoQueConverteVacaEmCachorro<span style="color: #F78811;">&#40;</span>mimosa<span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">latir</span><span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span></pre></div></div>

<p>Novamente gostaria de frisar que esse exemplo é mais didático do que funcional. Na prática poderíamos criar um conversor assim</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">implicit</span> <span style="color: #0000ff; font-weight: bold;">def</span> conversorQualquer<span style="color: #F78811;">&#40;</span>objeto<span style="color: #000080;">:</span> Any<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">new</span> <span style="color: #F78811;">&#123;</span>
        <span style="color: #0000ff; font-weight: bold;">def</span> latir<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #6666FF;">&quot;Um objeto qualquer agora passou a latir&quot;</span>
<span style="color: #F78811;">&#125;</span></pre></td></tr></table></div>

<p>Ou então poderíamos ter esses conversores em alguma outra classe e usar &#8220;static imports&#8221; para importar esses conversores para nosso código.</p>
<p>Lembrando sempre que se se não houver, ou haver mais de um conversor compatível, o compilador vai dar erro de compilação.</p>
<p>Conversores implicitos dão a mesma facilidade de &#8220;open classes&#8221; com a vantagem que essa conversão só terá efeito no trecho de código onde a função de conversão está visível. Não acontece de adicionarmos uma função em um objeto num canto do sistema e a mesma estar visível em outro, o que é uma desvantagem em potencial das open classes.</p>
<p>Esses conversores são usados muitas vezes pela pelo próprio Scala. Vejam por exemplo a documentação da classe <a href="http://www.scala-lang.org/docu/files/api/scala/Int.html">Int</a> onde é dito que existe um conversor implícito que converte uma instancia de Int para <a href="http://www.scala-lang.org/docu/files/api/scala/runtime/RichInt.html">RichInt</a>.</p>
<p>Num próximo post vou comentar sobre mixins classes com Scala.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2008/09/scala-implicit-converters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scalando, parte 2</title>
		<link>http://blog.gilliard.eti.br/2008/09/scalando-parte-2/</link>
		<comments>http://blog.gilliard.eti.br/2008/09/scalando-parte-2/#comments</comments>
		<pubDate>Fri, 19 Sep 2008 00:19:49 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[Scala]]></category>
		<category><![CDATA[JustJava 2008]]></category>
		<category><![CDATA[Linguagem JVM]]></category>

		<guid isPermaLink="false">http://gilliard.eti.br/blog/?p=38</guid>
		<description><![CDATA[No post anterior a gente viu algumas coisas de Scala de uma forma mais solta, para irmos acostumando com a inguagem. A partir deste post vou tentar mostrar algumas coisas mais específicas. Functions Em Scala, uma função é “first-class value”, isso que dizer que assim como qualquer outro valor elas podem ser passadas como parametro [...]]]></description>
			<content:encoded><![CDATA[<p>No <a href="http://blog.gilliard.eti.br/2008/09/ola-scala/">post anterior</a> a gente viu algumas coisas de Scala de uma forma mais solta, para irmos acostumando com a inguagem. A partir deste post vou tentar mostrar algumas coisas mais específicas.</p>
<p><strong>Functions</strong></p>
<p>Em Scala, uma função é “first-class value”, isso que dizer que assim como qualquer outro valor elas podem ser passadas como parametro para outras funções e serem valores de retorno de funções.</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">object</span> Main <span style="color: #0000ff; font-weight: bold;">extends</span> Application <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">def</span> percorreLista<span style="color: #F78811;">&#91;</span>T<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>lista<span style="color: #000080;">:</span>List<span style="color: #F78811;">&#91;</span>T<span style="color: #F78811;">&#93;</span>, funcao<span style="color: #000080;">:</span><span style="color: #F78811;">&#40;</span>T<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span> Unit<span style="color: #F78811;">&#41;</span><span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">for</span> <span style="color: #F78811;">&#40;</span>elemento <span style="color: #000080;">&lt;</span>- lista<span style="color: #F78811;">&#41;</span> <span style="color: #F78811;">&#123;</span>
      funcao<span style="color: #F78811;">&#40;</span>elemento<span style="color: #F78811;">&#41;</span>
    <span style="color: #F78811;">&#125;</span>
  <span style="color: #F78811;">&#125;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">def</span> imprimeElemento<span style="color: #F78811;">&#91;</span>T<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span>elemento<span style="color: #000080;">:</span>T<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
    println<span style="color: #F78811;">&#40;</span>elemento<span style="color: #F78811;">&#41;</span>
  <span style="color: #F78811;">&#125;</span>
&nbsp;
  percorreLista<span style="color: #F78811;">&#40;</span>List<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">2</span>,<span style="color: #F78811;">3</span>,<span style="color: #F78811;">4</span>,<span style="color: #F78811;">5</span><span style="color: #F78811;">&#41;</span>, imprimeElemento<span style="color: #F78811;">&#41;</span>
<span style="color: #F78811;">&#125;</span></pre></div></div>

<p>Aqui definimos uma função chamada percorreLista que faz o que o nome diz e para cada elemento ela invoca uma outra função passada como parametro, no caso a função imprimeElemento. Reparem na linha 2 a definição dos tipos dos parametros. O primeiro é uma lista do tipo T, nada demais. O segunda parametro é um pouco mais interessante. Definimos uma variável chamada funcao que é do tipo &#8220;função void que recebe T como parametro&#8221;. Então na linha 12 passamos a função imprimeElemento como parametro para a função percorreLista. A saída desse trecho de código é a seguinte</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #F78811;">2</span>
<span style="color: #F78811;">3</span>
<span style="color: #F78811;">4</span>
<span style="color: #F78811;">5</span></pre></div></div>

<p>Da mesma forma que passamos uma função como parametro, poderíamos retornar uma também. Mas para não alongar muito isso fica como tarefinha <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><strong>O caracter _</strong></p>
<p>Uma das coisas que eu mais estranhei nos códigos feitos com Scala, foi a constante aparição de um “_”, geralmente sendo passado como argumentos de funções. Isso causou mais estranheza pois em Java quase não temos esse caracter. Mas vamos a mais um exemplo.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">object</span> Main <span style="color: #0000ff; font-weight: bold;">extends</span> Application <span style="color: #F78811;">&#123;</span>
&nbsp;
    <span style="color: #0000ff; font-weight: bold;">def</span> escreveString<span style="color: #F78811;">&#40;</span>s<span style="color: #000080;">:</span>String<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
    println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Escrevendo-&gt;&quot;</span>+s<span style="color: #F78811;">&#41;</span>
  <span style="color: #F78811;">&#125;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">def</span> somatorio<span style="color: #F78811;">&#40;</span>i<span style="color: #000080;">:</span>Int<span style="color: #000080;">*</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
    <span style="color: #6666FF;">&quot;Soma=&quot;</span> + i.<span style="color: #000000;">reduceLeft</span><span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>a<span style="color: #000080;">:</span> Int, b<span style="color: #000080;">:</span> Int<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span> b + a<span style="color: #F78811;">&#41;</span> <span style="color: #008000; font-style: italic;">// executa mas nao faz efeito</span>
    <span style="color: #6666FF;">&quot;Soma=&quot;</span> + i.<span style="color: #000000;">reduceLeft</span><span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#40;</span>a,b<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span> a + b<span style="color: #F78811;">&#41;</span> <span style="color: #008000; font-style: italic;">//executa mas nao faz efeito</span>
    <span style="color: #6666FF;">&quot;Soma=&quot;</span> + i.<span style="color: #000000;">reduceLeft</span><span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span>+<span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span> <span style="color: #008000; font-style: italic;">//executa mas nao faz efeito</span>
    <span style="color: #6666FF;">&quot;Soma=&quot;</span> + i.<span style="color: #000000;">foldLeft</span><span style="color: #F78811;">&#40;</span><span style="color: #F78811;">0</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span>+<span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span> <span style="color: #008000; font-style: italic;">//executa mas nao faz efeito</span>
    <span style="color: #6666FF;">&quot;Soma=&quot;</span> + <span style="color: #F78811;">&#40;</span><span style="color: #F78811;">0</span> /<span style="color: #000080;">:</span> i<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span>+<span style="color: #000080;">_</span><span style="color: #F78811;">&#41;</span> <span style="color: #008000; font-style: italic;">// executa e retorna</span>
  <span style="color: #F78811;">&#125;</span>
&nbsp;
  escreveString<span style="color: #F78811;">&#40;</span>somatorio<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">1</span>,<span style="color: #F78811;">4</span>,<span style="color: #F78811;">6</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
<span style="color: #F78811;">&#125;</span></pre></td></tr></table></div>

<p>Saída</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;">Escrevendo-<span style="color: #000080;">&gt;</span>Soma<span style="color: #000080;">=</span><span style="color: #F78811;">11</span></pre></div></div>

<p>Como sempre eu já apriveitei o mesmo exemplo para mostrar várias coisas. Só vou falar da função domatorio, já que o resto só usa o que nós já vimos antes. A começar pelo parametro, é assim que definimos varargs em Scala. Então temos uma função que recebe uma lista de Int de tamanho variável. Na prática <code>i</code> é do tipo <del datetime="2010-11-25T17:50:03+00:00"><a href="http://www.scala-lang.org/docu/files/api/scala/Seq.html">Seq</a>[Int]</del>. <strong>update:</strong> A partir varsão 2.8 varargs são do tipo <a href="http://www.scala-lang.org/api/current/scala/collection/mutable/WrappedArray.html">scala.collection.mutable.WrappedArray</a>, nesse caso mais especificamente do tipo <code>scala.collection.mutable.WrappedArray$ofInt</code>.</p>
<p>No corpo dessa função eu coloquei de formas diferentes a mesma coisa, porém parti do mais legível para o mais ilegível. As funções <code>reduceLeft</code> e <code>foldLeft</code> trabalham de formas diferentes, mas nesse caso o resultado é o mesmo. Olhando o exemplo da documentação fica fácil entender como elas funcionam.</p>
<p>Como eu já disse antes, o retorno de uma função é sua última instrução. Nesse exemplo da função somatório, apenas a linha 12 retorna, as demais efetuam a mesma operação mas o valor é perdido por ninguem usar. A idéia é mostrar as formas diferentes de fazer a mesma coisa, e assim facilitar o entendimento do uso do caracter “_”.</p>
<p>Da linha 8 até a linha 10 usamos a função reduceLeft, e de cima para baixo eu fui reduzindo a especifidade dos parametros. Na linha 8 eu deixei totamente especificado e inverti o ordem ao somar <code>a</code> e <code>b</code>. Não que isso faça diferença no resultado, mas só para exemplificar que a vantagem de se ter as duas variáveis explicitas é poder saber “quem é quem”. Na linha seguinte eu não informei mais o tipo das variáveis a e b pois o Scala consegue perceber isso pra mim, mas continuo podendo brincar com a ordem os parametros pois ainda sei quem é quem.</p>
<p>A partir da linha 10 eu comecei a usar o caracter “_”. Veja que da linha 9 para a 10, olhando o código nós conseguimos perceber que não é tão útil ter as duas variáveis ali pois simplesmente repassamos elas para a expressao <code>a + b</code>. Olhando dessa forma a sintexe da linha 10 parece fazer mais sentido, pois nessa linha nós dizemos que tanto faz quais são as variáveis, eu só quero somá-las. O problema de usar isso é que a legibilidade do código começa a piorar um pouco.</p>
<p>Agora vamos ver as linhas 11 e 12. Olhando a documentação da função foldLeft vemos que ela recebe mais um parametro que o ponto de partida. Como estamos trabalhando com uma soma, passamos o 0, se fosse uma ultiplicação passaríamos 1, pois queremos que esse parametro não influencie no resultado. Mas apesar de mudarmos de função a sintaxe usada las linhas 10 e 11 são equivalentes. Agora na linha 12 bagunçamos de vez e usamos <code>/:</code>, um alias para a função <code>foldLeft</code>. Novamente o problema do código dessa linha é que fica muito ilegível. Olhando para ela, a sintaxe das linhas 10 e 11 até parece mais simpática <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><strong>Múltiplas listas de argumento</strong></p>
<p>Em Scala uma função, diferente do que acontece no Java, pode ter diversas listas de argumentos</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">object</span> Main <span style="color: #0000ff; font-weight: bold;">extends</span> Application <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">def</span> imprimeStrings<span style="color: #F78811;">&#40;</span>s<span style="color: #000080;">:</span>String<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#40;</span>s2<span style="color: #000080;">:</span>String<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
        println<span style="color: #F78811;">&#40;</span>s2 + <span style="color: #6666FF;">&quot;--&gt;&quot;</span> + s<span style="color: #F78811;">&#41;</span>
    <span style="color: #F78811;">&#125;</span>
    imprimeStrings<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;A&quot;</span>, <span style="color: #6666FF;">&quot;B&quot;</span><span style="color: #F78811;">&#41;</span></pre></div></div>

<p>Saída</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;">B--<span style="color: #000080;">&gt;</span>A</pre></div></div>

<p>Pode parecer meio estranho, mas essa sintaxe permite que façamos algo interessante com esse último parametro. A seguir continuamos o código de cima.</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;">    <span style="color: #0000ff; font-weight: bold;">def</span> funcaoQueDevolveString<span style="color: #F78811;">&#40;</span>i<span style="color: #000080;">:</span>Int<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
        <span style="color: #6666FF;">&quot;Número:&quot;</span> + i
    <span style="color: #F78811;">&#125;</span>
    imprimeStrings<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;A&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #F78811;">&#123;</span>
        funcaoQueDevolveString<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">5</span><span style="color: #F78811;">&#41;</span>
    <span style="color: #F78811;">&#125;</span>
<span style="color: #F78811;">&#125;</span></pre></div></div>

<p>Saída</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;">A--<span style="color: #000080;">&gt;</span>Número<span style="color: #000080;">:</span><span style="color: #F78811;">5</span></pre></div></div>

<p>A <code>funcaoQueDevolveString</code> é só para ilustrar que dentro do bloco de código da chamada da função <code>imprimeStrings</code> eu posso fazer qualquer coisa, desde que o retorno desse corpo seja do tipo do parametro que ele substitui.</p>
<p><strong>Implicit parameters</strong></p>
<p>Outra aplicação para mais de uma lista de argumentos é quando queremos ter uma lista de argumentos implicita. Vamos ao exemplo.</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">object</span> Main2 <span style="color: #0000ff; font-weight: bold;">extends</span> Application <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">implicit</span> <span style="color: #0000ff; font-weight: bold;">var</span> user <span style="color: #000080;">=</span> <span style="color: #6666FF;">&quot;Gilliard&quot;</span>
&nbsp;
    <span style="color: #0000ff; font-weight: bold;">def</span> executaOperacao<span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span><span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">=&gt;</span>Unit<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#40;</span><span style="color: #0000ff; font-weight: bold;">implicit</span> usuario<span style="color: #000080;">:</span>String<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
        println<span style="color: #F78811;">&#40;</span>usuario + <span style="color: #6666FF;">&quot; vai executar uma operação&quot;</span><span style="color: #F78811;">&#41;</span>
        f<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span>
        println<span style="color: #F78811;">&#40;</span>usuario + <span style="color: #6666FF;">&quot; executou uma operação&quot;</span><span style="color: #F78811;">&#41;</span>
    <span style="color: #F78811;">&#125;</span>
&nbsp;
    <span style="color: #0000ff; font-weight: bold;">def</span> operacao<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Executando operação&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
    executaOperacao<span style="color: #F78811;">&#40;</span>operacao<span style="color: #F78811;">&#41;</span>
<span style="color: #F78811;">&#125;</span></pre></div></div>

<p>Saída</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;">Gilliard vai executar uma operação
Executando operação
Gilliard executou uma operação</pre></div></div>

<p>Como isso funciona? Definimos uma função <code>executaOperacao</code> que recebe como primeiro parametro uma função. Até aqui nada de novo. Porém definimos uma segunda lista de argumentos com implicit. A palavra reservada implicit deve ser aplicada no início de uma lista de argumentos, e afeta todos os argumentos dessa lista. Além disso essa lista de argumentos deve ser a última. Então caso eu queira ter argumentos “normais” e argumentos implicitos, eu precisaria ter duas listas de argumentos como no exemplo.</p>
<p>Quando o compilador do Scala encontra uma função com parametros implicitos, ele busca por objetos implicitos que sejam compatíveis com esses parametros. Caso encontre, como no nosso exemplo, tudo bem, agora se não houver nenhum objeto implicito compatível teremos um erro de compilação. Mas isso é bem flexível, se eu não tivesse um objeto implícito e quisesse invocar uma função com parametros implícitos é só eu passar explicitamente esses parametros. Um parametro implícito se torna opcional, mas não é proibido colocar um valor explícito. Agora se mais de um valor explícito compatível estiver disponível o compilador não vai tentar adivinhar qual usar, vai dar erro de compilação.</p>
<p>No próximo post vou falar de implicit converters, que na minha opinião é uma das coisas mais bacanas e simples de usar do Scala. Aí sim a gente começa a ver o poder de uma linguagem escalável, com muito dinamismo mas sem deixar que “vire zona”.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2008/09/scalando-parte-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Olá Scala</title>
		<link>http://blog.gilliard.eti.br/2008/09/ola-scala/</link>
		<comments>http://blog.gilliard.eti.br/2008/09/ola-scala/#comments</comments>
		<pubDate>Tue, 16 Sep 2008 22:37:31 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[Scala]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JustJava 2008]]></category>
		<category><![CDATA[Linguagem JVM]]></category>

		<guid isPermaLink="false">http://gscordeiro.com/blog/?p=15</guid>
		<description><![CDATA[Estive presente no JustJava2008 e aos poucos vou postar aqui algumas das coisas interessantes que vi. Para começar, vou falar um pouco da linguagem Scala, que roda na JVM e que está ficando cada vez mais conhecida. Há algum tempo, pesquisando sobre Groovy, encontrei este post que fala sobre Scala. Depois disso me interessei e [...]]]></description>
			<content:encoded><![CDATA[<p>Estive presente no <a href="http://www.sucesusp.org.br/justjava2008/">JustJava2008</a> e aos poucos vou postar aqui algumas das coisas interessantes que vi. Para começar, vou falar um pouco da linguagem <a href="http://www.scala-lang.org/">Scala</a>, que roda na JVM e que está ficando cada vez mais conhecida.</p>
<p>Há algum tempo, pesquisando sobre <a href="http://groovy.codehaus.org/">Groovy</a>, encontrei <a href="http://alblue.blogspot.com/2007/06/java-is-scala-new-groovy.html">este post</a> que fala sobre Scala. Depois disso me interessei e pesquisei um pouquinho sobre Scala mas não evoluí muito no assunto.Porém depois da apresentação feita pelo <a href="http://blog.michaelnascimento.com.br/">Michael Nascimento</a> no JJ08, me animei a brincar com Scala mais um pouco e, agora que já tinha um norte, ficou muito mais fácil conseguir fazer algumas coisas com essa linguagem.</p>
<p>Primeiramente gostaria de dizer que não sou um expert em Scala, só estou compartilhando o que tenho aprendido nos últimos dias. Como já disse, esse post foi basicamente inspirado na apresentação do <a href="http://blog.michaelnascimento.com.br/">Mr. M</a> no JJ, e assim que as apresentações estiverem disponíveis vou colocar um link aqui. Outras fontes para esse artigo (e os próximos) é a série <a href="http://www.codecommit.com/blog/scala/roundup-scala-for-java-refugees">Roundup: Scala for Java Refugees</a>, além da própria <a href="http://www.scala-lang.org/node/198">documentação do Scala.</a></p>
<p>Scala é um &#8220;mix&#8221; de linguagem OO e <a href="http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_Funcional">linguagem funcional</a>. Em Scala tudo é objeto, não há primitivos, mas isso a gente ve mais pra frente. O nome Scala vem de &#8220;scalable language&#8221;. A idéia foi projetar uma linguagem que service bem para trabalhos simples como um pequeno script, até o desenvolvimento de grandes aplicações como fazemos hoje em Java com a &#8220;segurança de uma linguagem fortemente tipada&#8221;. Hoje em dia se fala muito sobre linguagens dinamicas que rodam na JVM, mas apesar de não parecer (pois olhando o código realmente as vezes não parece), Scala é fortemente tipada assim como Java. A diferença é que pelo fato do Scala usar de forma muito eficiente a inferencia de tipos, acabamos nao tendo aquela sintaxe carregada do Java onde temos que dizer o tipo em todos os lugares e ainda algumas vezes de forma repetida.</p>
<p>Entes de continuar, só para convencionar (mas não quero gerar polemica), chamei de dinamica uma linguagem não tipada.</p>
<p>Para os exemplos, eu usei o plugin do eclipse, mas voces podem ver os <a href="http://www.scala-lang.org/node/91#disc">plugins disponíveis</a> e usar sua IDE preferida.</p>
<p>Agora um exemplo das diferenças na hora da tipagem</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #003399; font-weight: bold;">List</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">String</span><span style="color: #339933;">&gt;</span> lista = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">ArrayList</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">String</span><span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>em Java temos que informar duas vezes que estaremos trabalhando com uma List que guarda Strings.</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">var</span> lista <span style="color: #000080;">=</span> List<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;A&quot;</span>, <span style="color: #6666FF;">&quot;B&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
<span style="color: #008000; font-style: italic;">//ou para ficar mais parecido com Java...</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">var</span> lista <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">new</span> ArrayBuffer<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span></pre></div></div>

<p>Note que nao foi necessário delarar a variável lista como uma coleção de Strings, isso porque o compilador do Scala, assim como nós, ao ler essa linha percebe que a lista referencia uma coleção de Strings. E se eu tentar adicionar qualquer outra coisa que não seja uma String vou ter um erro de compilação. Além disso como Scala não nos obriga a usar &#8216;;&#8217; (ponto e vírgula) no final das intruções. Então olhando um código sem definições de tipos em muitos casos, e sem &#8216;;&#8217;, às vezes da a impressão que estamos trabalhando com uma &#8220;linguagem dinamica&#8221; como Groovy por exemplo, já que tem o &#8220;estilão&#8221; Java de nomearmos as coisas.</p>
<p>Para rodar um código Scala podemos começar de tres formas:</p>
<p>1 &#8211; script:</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;">scala<span style="color: #000080;">&gt;</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Olá mundo!&quot;</span><span style="color: #F78811;">&#41;</span>
Olá mundo<span style="color: #000080;">!</span></pre></div></div>

<p>2 &#8211; extendendo a &#8220;classe&#8221; Application (mais pra frente explico melhor porque coloquei classe entre aspas, mas basicamente é porque Application não é de um tipo Java como class ou interface)</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">object</span> Main <span style="color: #0000ff; font-weight: bold;">extends</span> Application <span style="color: #F78811;">&#123;</span>
    println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Olá mundo!&quot;</span><span style="color: #F78811;">&#41;</span>
<span style="color: #F78811;">&#125;</span></pre></div></div>

<p>3 &#8211; ou ainda usando o já conhecido método main</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">object</span> Main2 <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">def</span> main<span style="color: #F78811;">&#40;</span>args<span style="color: #000080;">:</span>Array<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
        println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Olá mundo!&quot;</span><span style="color: #F78811;">&#41;</span>
    <span style="color: #F78811;">&#125;</span>
<span style="color: #F78811;">&#125;</span></pre></div></div>

<p>Com esses exemplos ja podemos perceber muitas diferenças em relação ao Java. Talvez a primeira coisa seja o object antes de Main e Main2. Em Java não temos como definir diretamente um object, apenas podemos declarar class e interface. Mas object nada mais é do que uma forma que a própria linguagem nós de definirmos um singleton. Na prática, todos os métodos de um object são acessíveis como métodos estáticos, mas internamente a execução é delegada para um singleton dessa &#8220;classe&#8221;. Por isso mesmo no exemplo 3 não precisamos definir o método main como estático.</p>
<p>Outra coisa que percebemos é que primeiro declaramos a variável, e depois (se for necessário) informamos o tipo. Isso não tem nada demais mas para quem está acostumado com Java como eu vai querer declarar &#8220;String s&#8221; algumas vezes antes de acostumar com &#8220;s : String&#8221; <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Outra coisa que pode ter passado batido no exemplo 2 é que o println está no corpo do nosso objeto, sem nenhum método em volta dele. Isso acontece porque Application tem um método main que nesse caso serve apenas para podermos executar nossa Main, mas na verdade quem executa o println da linha 2 do segundo exemplo é o contrutor do nosso objeto. Vamos a outro exemplo para ficar mais claro.</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">object</span> Main3 <span style="color: #F78811;">&#123;</span>
    println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;antes&quot;</span><span style="color: #F78811;">&#41;</span>
    <span style="color: #0000ff; font-weight: bold;">def</span> main<span style="color: #F78811;">&#40;</span>args<span style="color: #000080;">:</span>Array<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
        println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;durante&quot;</span><span style="color: #F78811;">&#41;</span>
    <span style="color: #F78811;">&#125;</span>
    println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;depois&quot;</span><span style="color: #F78811;">&#41;</span>
<span style="color: #F78811;">&#125;</span></pre></div></div>

<p>A saída do código acima é</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;">antes
depois
durante</pre></div></div>

<p>Isso se deve ao fato de em Scala, o contrutor padrão de um objeto ser o corpo da classe (obviamente declaracoes de métodos não entram aqui). É como a inicialização estatica em java, que executa antes do contrutor, a diferença é que aqui o que seria essa inicliazação estatica é o contrutor. Mas vamos entrar mais a fundo nisso depois.</p>
<p>Vamos a mais um exemplo</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">object</span> Main4 <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">def</span> main<span style="color: #F78811;">&#40;</span>args<span style="color: #000080;">:</span>Array<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
        <span style="color: #0000ff; font-weight: bold;">def</span> éPar<span style="color: #F78811;">&#40;</span>i <span style="color: #000080;">:</span> Int<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
            i <span style="color: #000080;">%</span> <span style="color: #F78811;">2</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">0</span>
        <span style="color: #F78811;">&#125;</span>
        println<span style="color: #F78811;">&#40;</span> éPar<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">10</span><span style="color: #F78811;">&#41;</span> <span style="color: #F78811;">&#41;</span>
    <span style="color: #F78811;">&#125;</span>
<span style="color: #F78811;">&#125;</span></pre></div></div>

<p>A saída do trecho de código acima é true. Mas nesse exemplo podemos ver muitas outas coisas interessantes. Primeiramente dentro de um método podemos declarar outro método (além de diversas outras coisas, inclusive fazer imports visíveis dó naquele escopo). Em Java também podemos fazer algo parecido, usando uma classe interna anonima. Inclusive é isso que o Scala vai gerar no bytecode, mas isso já é outra história.<br />
Só abrindo um parenteses, eu falo muito em método pois sou um programador Java, falando pra outros programadores Java, mas muita gente pode achar ruim pois talvez o correto seria eu falar function, lembrando que Scala é uma linguagem funcional. Fecha parenteses <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
Também não precisamos declarar o tipo de retorno do nosso método pois o Scala consegue inferir isso pra gente. Assim como eu posso olhar e perceber que isso vai retornar um Boolean, o compilador do Scala também pode.</p>
<p>Essa delcaracao seria o mesmo de</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">def</span> éPar<span style="color: #F78811;">&#40;</span>i <span style="color: #000080;">:</span> Int<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">:</span> Boolean <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span> ... <span style="color: #F78811;">&#125;</span></pre></div></div>

<p>Assim como na definição da main eu poderia colocar asssim</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">def</span> main<span style="color: #F78811;">&#40;</span>args<span style="color: #000080;">:</span>Array<span style="color: #F78811;">&#91;</span>String<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">:</span> Unit <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span> ... <span style="color: #F78811;">&#125;</span></pre></div></div>

<p>Em Scala, o correspondente para o void do Java é Unit.</p>
<p>Outra coisa que não precisamos colocar explicitamente é o return, poi o Scala considera como o retorno de um método a sua última linha. No entanto em alguns casos, como no uso de recursão ou quando descobrimos antecipadamente o que deve ser retornado, acabamos precisando explicitar o return, aí nesse caso precisamos deixar explicito também o tipo de retorno do método.</p>
<p>Como a maioria das linguagens de script, Scala permite que chamemos um método de uma forma diferente, sem o &#8216;.&#8217; e os &#8220;(&#8230;)&#8221; o que possibilita que possamos usar</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;">i <span style="color: #000080;">%</span> <span style="color: #F78811;">2</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">0</span></pre></div></div>

<p>em vez de usar o equivalente</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #F78811;">&#40;</span>i.<span style="color: #000080;">%</span><span style="color: #F78811;">&#40;</span><span style="color: #F78811;">2</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>.<span style="color: #000080;">==</span><span style="color: #F78811;">&#40;</span><span style="color: #F78811;">0</span><span style="color: #F78811;">&#41;</span></pre></div></div>

<p>Isso mesmo, pode parecer meio estranho mas isso é assim. Em Scala não existem primitivos, e também não existe sobrecarga de operadores (o que seria dos professores de POO com C++ que só sabiam dar isso de matéria se o Scala virasse padrão nessas instituições hein&#8230;.). O que ocorre é que em Scala &#8220;%&#8221; e &#8220;==&#8221; são nomes válidos para métodos. Assim como praticamente qualquer coisa que podemos escrever como <<, >;=, +=, *, etc.</p>
<p>Esse primeiro post foi mais para dar uma idéia de como começar a brincar com Scala, mas nos próximos vou entrar em mais aspectos da linguagem como objetos imutáveis, traits, closures, etc.</p>
<p>Qualquer gafe minha voces postem um comentário que eu corrijo ok? Até o próximo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2008/09/ola-scala/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

