Artigo do tipo Exemplos Práticos
Recursos especiais neste artigo:
Conteúdo sobre Novidades.
Novidades do Java 8: Do Lambda ao Metaspace
Neste artigo, veremos três das principais novidades que virão na nova versão do Java 8. Faremos uma discussão aprofundada sobre as Expressões Lambda e os impactos da incorporação desta funcionalidade na linguagem. Discutiremos também sobre a nova API de datas e como ela surge para facilitar substancialmente o trabalho com objetos deste tipo. E finalizaremos com uma rápida análise sobre a remoção do PermGen e a criação do Metaspace para ocupar o seu lugar, analisando ainda as consequências desta substituição.

Em que situação o tema é útil
Antecipar-se às novidades da nova versão do Java prepara o desenvolvedor para assimilar e colocar em prática em seus projetos, de maneira mais fácil e tranquila, as futuras mudanças desta plataforma. Isto se torna ainda mais relevante quando temos uma nova versão da linguagem que traz recursos que alteram significativamente a forma como codificamos nela. Estes recursos atendem pelo nome de Expressões Lambda e é a mudança mais significativa.

Marcada para ser lançada em meados de 2014, a nova versão do Java trará mudanças significativas, e muito interessantes, na forma como programamos nesta linguagem. Estas mudanças não são apenas através de novas APIs ou somente mudanças sutis na JVM: elas influenciam até mesmo a sintaxe da linguagem. Neste artigo, detalharemos como o Java 8 agora incorpora conceitos oriundos de linguagens funcionais, como o LISP, Haskell e Earlang, para tornar ainda mais fácil determinadas tarefas que antes necessitavam de muitas linhas de código.

Para aqueles que já se aventuraram em linguagens como Scala, que executa na JVM, estas mudanças não serão tão surpreendentes. Contudo, para os demais, são mudanças que precisarão de um tempo para serem totalmente assimiladas e incorporadas em seu dia a dia. A principal mudança atende, basicamente, por um único nome: Projeto Lambda. E este artigo abordará bastante sobre as expressões lambda, discutindo como elas vão afetar seu jeito de programar.

Mas as mudanças vão além, abrangendo também uma nova API para trabalhar com datas. Aliás, este é um tópico interessante, uma vez que a antiga API do Java para esta tarefa não era bem vista e havia um pedido constante por mudanças por parte da comunidade. Felizmente, teremos uma API totalmente reescrita, melhor e mais fácil de usar.

Outro assunto que desperta curiosidade é a remoção do PermGen (Permanent Generation) e a criação do Metaspace para ocupar seu lugar. Vamos entender como ambos funcionam e quais os impactos desta mudança. Podemos adiantar que você não ficará livre do famigerado erro PermGen Space, que assombra os desenvolvedores que não são muito cuidadosos e acabam criando códigos que drenam essa área de memória.

Apesar de termos estas grandes mudanças, a modularização da plataforma, prevista para esta nova versão, foi mais uma vez postergada e agora está agendada para aparecer somente na versão 9. Para mais informações sobre como será a modularização do Java, veja a seção Links. Embora este artigo tenha como foco as três mudanças já citadas, outras também foram incorporadas, visando tornar a linguagem mais simples de usar e mais robusta. Para ver a lista completa de mudanças, acesse o endereço indicado na seção Links.

Todas as novidades que discutiremos neste artigo estavam inicialmente programadas para serem lançadas em 2013, entretanto, foi adiada para meados de 2014 devido à avalanche de críticas, relacionadas à segurança, que a plataforma Java sofreu recentemente. Estas críticas fizeram a Oracle adiar seu lançamento, visando mais tempo para revisar e disponibilizar uma versão mais robusta nesse aspecto. Entretanto, não precisamos aguardar até esta data para entender algumas das mudanças mais significativas que vêm por aí.

Instalando o Java 8 Early Access

Apesar de a versão final estar programada somente para o ano de 2014, já podemos ter um gostinho do que virá instalando uma versão de testes, chamada Early Access Release. Esta versão vem em dois sabores: uma com suporte para as expressões lambda e a outra sem esse suporte. Instalaremos aqui a versão que possui o suporte para essas expressões, uma vez que um dos nossos objetivos é demonstrar o uso desta nova característica.

Para realizar a instalação desta versão, acesse a página de downloads do Java 8 (veja o endereço na seção Links) e baixe a versão específica para o seu sistema operacional. Desta forma, você terá um arquivo em formato Zip ou Tar.Gz disponível em sua máquina. Descompacte esse arquivo em um diretório de sua preferência. Ao fazer isto, teremos a estrutura de pastas padrão de um JDK do Java. Dentro desta nova pasta, temos uma subpasta chamada bin, que contém os binários do Java que nos permitem compilar e executar programas escritos nesta linguagem. Tratam-se dos binários javac e java, que devem ser utilizados no lugar daqueles que, provavelmente, já existem em seu path padrão, caso você já tenha uma versão anterior do Java instalada em sua máquina.

Sugerimos não colocar esse JDK no seu path, pois se trata de um JDK ainda em desenvolvimento, não sendo, portanto, indicado para uso em produção. Com esta versão em mãos, podemos partir para a próxima seção e discutir sobre a mudança mais alardeada desta plataforma: as expressões lambda!

Expressões Lambda

Da perspectiva da linguagem, provavelmente a mudança que mais chama a atenção no Java 8 são as Expressões Lambda. Isto ocorre porque esta nova característica altera significativamente a forma como usamos a linguagem, incorporando conceitos oriundos da programação funcional. As expressões lambda fazem parte do Projeto Lambda, na forma da JSR 335, que inclui também a extensão virtual de métodos, analisadas na próxima seção, e também melhorias no suporte a multinúcleo, através de um novo recurso do Java 8 chamado Parallel Collections, que abordaremos em um artigo futuro.

Para entendermos melhor como as expressões lambda impactam a linguagem Java, precisamos inicialmente aprender o que elas são independentemente de linguagem de programação. Para isto, vamos nos aventurar um pouco na matemática, com o que conhecemos como Cálculo Lambda (ver seção Links para mais detalhes), que foi a fonte de inspiração das linguagens de programação funcional. Embora não seja nossa intenção iniciar uma extensa aula de matemática neste artigo, há uma peculiaridade no Cálculo Lambda que nos fará entender melhor a sintaxe dessas expressões: as funções não precisam ser nomeadas explicitamente, pois nomes são uma mera conveniência.

Desta forma, para simplificar, uma expressão lambda pode ser entendida como uma função anônima, ou seja, uma função declarada sem definir explicitamente um nome para ela. Uma vez que a função não tem um nome, fica óbvio que não podemos executá-la da forma convencional que a maioria das linguagens de programação faz, que é escrever o nome da função seguido de parênteses (a sintaxe varia de linguagem para linguagem, é claro). Então, como ela será executada? Veremos nos exemplos a seguir.

Para entendermos melhor esses conceitos, começaremos com um pequeno trecho de código, no qual temos uma pseudolinguagem que define uma função chamada minhafuncao. Trata-se de uma função sem parâmetros e que apenas retorna um texto. Veja o código:

// Corpo da função.

function minhafuncao() {

return “retorno da funcao”;

}

// Chamando nossa função definida logo acima.

minhafuncao();

Observe que, seja qual for a linguagem, sempre teremos uma sintaxe específica para declarar funções, seja usando uma palavra-chave, como function, ou outra qualquer. Continuando com a análise do trecho de código proposto, depois que declaramos a função, a chamamos usando o nome que atribuímos a ela seguido de parênteses: minhafuncao(). Uma expressão lambda funciona um pouco diferente, pois ela é declarada conforme o trecho de código a seguir:

var variavel = function() {

return “retorno da funcao”;

};

variavel();

Neste trecho de código, atribuímos uma função a uma variável e depois a executamos a partir desta mesma variável, usando a sintaxe “nome da variável” seguida por parênteses. Note que a função não foi nomeada, logo não temos como chamá-la da forma que estamos habituados. Este trecho exemplifica o que chamamos de função anônima. Neste contexto, podemos até mesmo passar uma função como parâmetro para outra função. Esta característica pode ser entendida por meio do trecho de código a seguir:

...
Quer ler esse conteúdo completo? Tenha acesso completo