FEA-JV8-001 – Novidades Java 8: porque tanta expectativas?

Publicado: 04/03/2014 por Guilherme Weizenmann em Básico, java
Tags:,

Olá Pessoal.

Estive olhando as novidades do Java 8 e resolvi reportar um pequeno resumo. Desde o Java 5, uma nova versão do Java nã era tão aguardada. No Java 5 foram aicionados Annotations e Generics. O Java 8 irá estreiar Lambdas e Streams.

Gordan Freeman, at Black Mesa, Lambda Core

Lambdas são um rescurso genérico, derivado de conceitos funcionais, e muito similar a Scala (outra lingagem que roda na JVM). A descrição do recurso é a seguinte:

Expressões Lambda são uma nova e importante funcionalidade no Java SE 8. Elas provêm uma forma clara e concisa de representar 1 método de uma interface usando uma expressão. Expressões Lambda também melhoram as bibliotecas Collection fazendo com que seja fácil iterar sobre, filtrar e extrair dados de uma Collection. Adicionalmtente, novas funcionalidades de concorrência melhoram a performance em ambientes multiprocessados.
Java SE 8: Lambda Quick Start em 04/03/2014 em inglês. Tradução do autor.

A idéia básica é facilitar o desenvolvimento, principalmente de códigos que iteram sobre collections, baseado em interfaces, que também trazem novidades, devido aos Lambdas. A parte da concorrência é implementada por “debaixo dos panos”, pra você não ter que se preocupar com isso.

Olhando através do espelho

As interfaces, até o Java 7, serviam para criar assinaturas de métodos, sem implementação padrão. Mas com o surgimento dos Lambdas, e a necessidade de manutenção de código legado temos o seguinte problema:

Se alterarmos uma interface em um projeto já existente, e adicionarmos um método a ela, obrigaremos todas as classes que implementam essa interface a implementar esse novo método, quebrando assim o código existente.

Visando resolver esse problema, no Java 8 foram introduzidos os “métodos padrões” (Default Methods, também chamados “virtual extension methods” ou “defender methods”). São métodos com implementação padrão em Interfaces. Esses métodos com implementação padrão não precisam ser implementados pelas subclasses, mas podem ser sobrescritos se preciso. Assim é possível alterar um interface sem quebrar compatibilidade. Como as interfaces dos Collection foram modificadas com o adventos dos Lambda, foi preciso a criação dos métodos padrões para evitar a quebra de código ou o mega trabalho para ajustar tudo.

Mas lembre-se, as interfaces não guardam estados e não são, portanto, substitutas das classes abstratas. Classes abstratas e interfaces ainda são diferentes e tem funções diferentes.

Outra coisa importante: múltiplas heranças. Com os métodos padrões surge um problema. Dadas duas interfaces com métodos de mesmas assinatura, com implementação padrão, qual deverá ser escolhido? O problema, no Java, é resolvido em tempo de compilação. A classe deverá implementar (sobrescrever o método em questão, mesmo que seja chamando a implementação default de uma das interfaces implementadas) ou o compilador irá gerar uma mensagem de erro e não compilará a classe.

Seguindo o fluxo do rio

Aleḿ das alterações em interfaces e surgimento dos Lambdas, surgem também os Streams. Mas o que são?

Wrappers sobre coleções que suportam várias operações convenientes e de alta performance expressadas sucintamente com Lambdas.
Java 8 Tutorial: Lambda Expressions, Streams, and More – Java 8 Streams Part 1 em 04/03/2014 em inglês. Tradução do autor.

Streams não guardam dados, mas possuem uma entrada de dados baseada, por exemplo, em um ArrayList. Recuperando o stream dessa lista, pode-se facilmente aplicar operações em cada elemento (forEach), como aplicar filtros (filter), entre outras. O importante de lembrar é que esses métodos foram feitos para se trabalhar com Lambdas.

Pequenos detalhes

Além dessas grandes mudanças, outras pequenas serão adicionadas. Citarei apenas algumas:

  • Nashorn JavaScript Engine: suporte a javascript embarcado e disponível para qualquer aplicação
  • Repeating Annotations: atualmente cada anotação somente pode ser usada uma vez (na classe, método, prorpiedade). O Java 8 terá suporte a repetição de anotaçãoes!
  • Java Time API: nova api para trabalhar com datas e horas, substituindo o velho e proplemático java.util.Date

E se eu encontrar outra que vale a pena postar, eu atualizo o post…..

Going back home

Pra terminar, fazendo um resumo do resumo, Lambdas são a grande novidade, trazendo mudanças em várias outras estruturas do Java. Com isso, será mais rápido desenvolver, sem perder compatibilidade com o que já existe, e mais rápido operar sobre collections.

Até mais e obrigado pelos peixes!

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s