Artigo no estilo: Curso

Por que eu devo ler este artigo:Este artigo mostra em detalhes como funcionam as Expressões Lambda (EL), a nova feature que entrará em vigor na próxima versão do JDK e que mudará substancialmente a maneira de desenvolver software escrito em Java.

O conteúdo do artigo é bastante conceitual e tem por objetivo primário demonstrar todo alicerce que suporta uma das maiores atualizações da história do Java e também como as novas features do Java 8 estão posicionadas frente a implementações em outras linguagens, como C# e Scala, que há anos possuem bibliotecas maduras e consolidadas para maximizar a usabilidade das Expressões Lambda.

Após anos esperando, finalmente os desenvolvedores Java terão oportunidade de codificar e manipular estruturas de dados com uma sintaxe muito mais simples e expressiva, utilizando as expressões lambda (EL).

A nova API, proveniente da JSR 335, inicialmente estava prometida para o JDK 7, porém muito antes da especificação ser concebida, já havia diversas outras propostas para implementação de EL desde o ano de 2006, como BGGA e CICE (ver seção Links), mas não se chegava a um consenso de qual direção seguir.

Ao mesmo tempo em que se discutiam as mudanças necessárias no JDK e na JVM para suportar EL, havia pressão para o lançamento do Java 7, pois após quatro anos sem uma nova versão “major”, o Java 6 demonstrava sinais de fadiga e muitas outras novas JSRs como o Project Coin e NIO2 já estavam entregues.

No final de 2010, Mark Reinhold anunciou em seu blog, o “plano B”, que consistia em entregar o Java 7 sem EL e sem o sistema de módulos (Jigsaw), provavelmente as duas features mais aguardadas pela comunidade Java.

Embora sem muitas evoluções que pudessem ser desfrutadas pelos programadores, a versão 7 da JVM veio acompanhada da nova instrução invokedynamic, a qual gerou enormes alterações na JVM e, como veremos, era o ingrediente que faltava para a implementação de EL.

Conheça nosso curso de Lambda Expressions

A implementação da JSR 335 provocou uma das maiores atualizações em termos de código fonte, tanto na JVM como no JDK (compilador e bibliotecas). Para se ter uma ideia, ao enumerarmos as novas classes dos pacotes java.util e java.util.concurrent que dão suporte à JSR 335 no JDK 8, chegamos ao expressivo número de 283 classes. Se somarmos também as classes dos novos pacotes java.util.function e java.util.stream, chegamos a um total de 896 classes a mais no JDK 8 em relação ao JDK 7, como pode ser visto na Tabela 1.

Comparação do número de classes
entre o Java 7 e o Java 8

Tabela 1. Comparação do número de classes entre o Java 7 e o Java 8.

Nessa tabela estamos contando cada EL utilizada no código fonte do próprio JDK 8 (build 1.8.0-ea-b113) como uma classe, pois como veremos, efetivamente uma EL substitui uma classe. Note que do total das 896 novas classes, 284 são representadas como EL, ou seja, praticamente um terço do total de classes nesses pacotes já é baseado em EL.

Neste artigo vamos explorar algumas das novas funcionalidades proporcionadas pela JSR 335 e comparar alguns detalhes da implementação com relação a outras linguagens que já fazem uso de técnicas funcionais proporcionadas pelas Expressões Lambda.

A JSR 335

A JSR 335 é uma especificação ampla e ambiciosa. Embora o objetivo central da JSR seja proporcionar a presença sintática de EL em código fonte Java, ao oferecer essa possibilidade para os programadores automaticamente é criado um novo (e imenso) desafio: apresentar uma biblioteca de nível similar às que são encontradas em “produtos concorrentes”, como C# e Scala, que por sua vez possuem classes e estruturas especificamente criadas para se beneficiar de EL.

Para que isto fosse possível, diversas JEPs (JDK Enhancement Proposals) foram criadas para alavancar a JSR 335 e dentre essas, chamam a atenção a JEP 108, que tem por objetivo evoluir o framework de coleções, e a JEP 107, que consiste em oferecer uma linguagem fluente para processamento em lote de estruturas de dados.

Para compreender e fazer melhor proveito de todas as novas features proporcionadas por EL, é necessário examinar o seguinte conjunto de implementações e APIs que orbitam em torno da JSR 335:

· A sintaxe de Expressões Lambda;

· SAM Types;

· Defender Methods;

· API do pacote java.util.function;

· Avaliação Lazy, Processamento em Lote e o pacote java.util.stream;

· Estratégias do Compilador, escopo de Expressões Lambda e a Instrução invokedynamic.

Neste artigo vamos abordar os quatro primeiros tópicos desta lista e na segunda parte mostraremos a engenharia por trás da sintaxe de EL, bem como a API de Streams para o processamento de coleções.

A sintaxe de Expressões Lambda

Em Java, uma EL pode ser utilizada para representar a execução de um bloco de código proveniente de métodos de classes anônimas, que atualmente (até o Java 7) é construído através de classes internas anônimas, como mostrado na Listagem 1.

Listagem 1. Representação de blocos de código via classes anônimas.

 
   public void codeJava7() throws Exception{
    
    ExecutorService pool = //...;
    
    Future<Integer> f = pool.submit(new Callable<Integer>() {
   
     @Override
     public Integer call() throws Exception {
      return 1;
     }
    });
   
    JButton jb = new Jbutton();
    
    //registra Action Listener
    jb.addActionListener(new ActionListener() {
      
     @Override
     public void actionPerformed(ActionEvent e) {
      System.out.println("Perform Action...");
      //...impl
     }
    });
   
   }

Em Java 8, com a nova sintaxe de EL, esse código pode ser rescrito de forma muito mais compacta e elegante, como pode ser visto na Listagem 2.

Listagem 2. Representação de blocos de código via EL.

 
   ... 

Quer ler esse conteúdo completo? Seja um assinante e descubra as vantagens.
  • 473 Cursos
  • 10K Artigos
  • 100 DevCasts
  • 30 Projetos
  • 80 Guias
Tenha acesso completo