Concrete Logo
Hamburger button

Java 8? Lambda? Calma, é mais fácil do que você imagina!

  • Blog
  • 3 de Abril de 2017
Share

Já não é de agora que temos ouvido um zum zum zum sobre Programação Funcional. Então, que tal falar um pouco sobre o que Lambda trouxe de Funcional para o Java 8?

É perceptível a evolução do Java na história, principalmente no que se refere ao seu sistema de tipos. O Java 8 e seus novos recursos trouxeram grande mudança para o cenário, principalmente com as expressões lambda e as vantagens da programação funcional. Mas o que é “programação funcional’? Bom, podemos definir assim:

“Um paradigma de programação que trata a computação como uma avaliação de funções matemáticas que evita estados ou dados mutáveis. Ela enfatiza a aplicação de funções, em contraste com a programação imperativa, que enfatiza mudanças no estado do programa”.

A introdução de expressões Lambda no Java 8 permite passar funções e comportamentos como argumentos em uma chamada de método.

“Ai Bottini, isso é verdade? Como isso é possível, Bottini?”

Sim, isso é completamente novo e causa uma disruptura no universo Java. Antes, só se escreviam métodos nos quais os parâmetros fossem objetos!

Entender como o pensamento funcional se manifesta é muito mais simples do que aparenta ser, ele pode ser visto como uma evolução das práticas de programação orientada a objetos. E aprender a partir de exemplos já conhecidos torna a tarefa muito mais simples.

Vamos dar uma olhada, a partir da abordagem 1, como seria um método que auxiliaria, por exemplo, o setor de RH a encontrar um candidato a desenvolvedor.

Abordagem 1:

O método a seguir imprime os desenvolvedores que correspondem aos critérios de pesquisa especificados:

O método apresentado acima verifica cada instância da classe Desenvolvedor que estão contidas na lista dev e que satisfazem os critérios de pesquisa especificados na Interface Selecao representada pela variável selecao que invoca o método Selecao.filtro. Caso o método selecao.filtro retorne um true, o método exibirDesenvolvedor é chamado por meio da instância do Desenvolvedor.

Agora vamos ver como estão definidos os critérios da Interface Selecao:

Seguindo a lógica, vamos ver a classe que implementa a interface Selecao com uma implementação para o método filtro. Este método é responsável por filtrar membros que são elegíveis para o cargo de desenvolvedor. O método retorna um true se o candidato, Desenvolvedor, estiver entre as idades de 18 a 65 anos:

Tudo certo até aqui! Agora para usar a classe vamos criar uma nova instância e invocar o método encontrarDesenvolvedor:

Na abordagem demonstrada acima não seria preciso alterar código caso o corpo da classe Desenvolvedor fosse modificada, teríamos toda a autonomia de criar uma nova interface e uma nova classe para execução de novas pesquisas de seleção.

“Bottini, mas cadê o Lambda?”

Calma, já vamos chegar lá. Porém, antes vamos ver como esse código pode ser melhorado e otimizado.

Como FiltraCandidatosElegiveisService implementa uma interface, nós podemos usar uma classe anônima em vez de uma classe local e ignorar a necessidade de declarar uma nova classe para cada pesquisa. Vamos ver isso na abordagem 2.

Abordagem 2:

Nessa abordagem o uso da classe anônima já faz um milagre e tanto com o nosso código, pois um dos argumentos da invocação do método encontrarDesenvolvedor agora realiza todos os critérios necessários para a nossa seleção de candidatos:

Esse tipo de escrita já reduz a quantidade de código porque não precisamos criar uma nova classe para cada pesquisa que desejamos executar. No entanto, a sintaxe de classes anônimas não é lá aquelas coisas bonitas de se ver e acabam às vezes causando um certo desconforto no entendimento do código.

  “Bottini, eu já estou cansado! Cadê o Lambda, Bottini?”

Chegou a hora! Agora vem a entrada triunfal de nosso protagonista Lambda! Vamos observar como podemos melhorar, ainda mais, esse comportamento de código com a aplicação de Lambda na abordagem 3.

Abordagem 3:

A interface Selecao é, a partir do Java 8, naturalmente uma interface funcional. Uma interface funcional é qualquer interface que contenha apenas um método abstrato, além de poder conter um ou mais métodos padrão ou métodos estáticos.

Uma vez que uma interface funcional contém apenas um método abstrato, você pode omitir o nome desse método quando você for implementá-lo. Para fazer isso, em vez de usar uma expressão de classe anônima igual fizemos anteriormente, podemos usar uma expressão lambda:

Simples assim. E tem mais!

Nós também podemos acrescentar em nossa interface Selecao uma Annotation:

    “Qual a diferença disso, Bottini?”

Essa Annotation vai garantir que se um novo método abstrato for inserido na interface ocorra o erro a seguir:

O uso dessa Annotation é opcional, mas garante que as interfaces existentes antes do Java 8 não quebrem.

“Nossa Bottini, isso é demais! Mas como essa mágica funciona, Bottini?”

Vamos lá! A expressão Lambda nada mais é do que a representação de uma classe anônima. Vamos olhar com mais cuidado:

george1

O método Selecao.filtro contém um parâmetro, d, que representa uma instância da classe Desenvolvedor. Temos o operador em forma de seta -> e, por fim, temos o corpo da função, que consiste em uma única expressão ou um bloco de declaração.

Igualzinho à classe anônima, não? Só que muito mais limpa e fácil de escrever! Ainda podemos omitir o tipo de dados dos parâmetros, os parênteses (se houver apenas um parâmetro) e um monte de coisas legais que simplificam, e muito, o nosso código. Mas vamos deixar isso para um próximo post, certo?

“Bottini, isso é fantástico! Agora eu realmente entendi esse código maluco!”

É isso aí galera! Espero que tenham gostado, isso foi apenas uma pequena introdução do que o universo Java 8 e as expressões Lambda podem trazer de benefícios para um código mais limpo e funcional.

Obrigado especial ao Olavo Castro pela oportunidade de escrever o post e ao André Formento, por me guiar ao caminho certo dessa escrita com seus conhecimentos e revisões.

Tem alguma dúvida ou comentário a fazer? Aproveite os campos abaixo. Até a próxima!

É desenvolvedor Java e quer fazer parte de um time multidisciplinar e ágil de verdade? Clique aqui.