Sabemos que a evolução é algo inerente a tecnologia. Com isso, linguagens de programação tendem a evoluir para suprir tais necessidades de maneira mais organizada.

Java na sua versão 8, traz diversas melhorias para desenvolvedores, ao qual destacamos o Lambda. No site da Oracle, Silva (2016) afirma que “Essa novidade proporcionou ao Java a adição de recursos muito disseminados em linguagens funcionais, facilitando em muito a vida de quem desenvolve sistemas.”. Antes de começarmos a estudar essa mudança no JAVA, vamos entender um pouco sobre o que seria uma função lambda.

Levemos como exemplo uma função nomeada de “soma”, onde:

Soma(x,y) = x+y

Nesta função recebemos 2 números e retornamos sua soma. Até aqui nada de novo. Mas concorda que se retirarmos a declaração explicita da função “soma”, teríamos uma função mais limpa? Bem, este seria aqui temos um dos principais pontos do cálculo lamda, Funções não precisam ser nomeadas explicitamente (Wikipedia). Ou seja, podemos ter a mesma coisa de forma anônima:

(x,y) -> x+y

 

Outro ponto a observar, é que podemos ter uma função que a saída seja uma outra função:

X -> (y -> x+y)

 

Caso queira se aprofundar no cálculo lambda, no Wikipedia tem um conteúdo bom para início (https://pt.wikipedia.org/wiki/C%C3%A1lculo_lambda)

Lambda no Java

No java 8, temos como principal destaque a Stream API, que traz facilidade para manipular coleções (List<Object>, ArrayList…) por intermédio de novas classes e métodos. No site, a Oracle afirma que “A Streams API traz uma nova opção para a manipulação de coleções em Java seguindo os princípios da programação funcional. Combinada com as expressões lambda, ela proporciona uma forma diferente de lidar com conjuntos de elementos, oferecendo ao desenvolvedor uma maneira simples e concisa de escrever código que resulta em facilidade de manutenção e paralelização sem efeitos indesejados em tempo de execução.” Onde o objetivo “[…] é fazer com que o desenvolvedor não se preocupe mais com a forma de se programar o comportamento, deixando a parte relacionada ao controle de fluxo e loop a cargo da API”.

Então mãos à obra.

 

Criando um Array e Realizando ForEach

Primeiro vamos começar criando uma lista e realizando um ForEach, através dessa nova perspectiva. (Ignorem a segunda parte do código, será utilizada posteriormente.

Notou a diferença? O foreach agora trata-se de uma “função”, e você consegue realizar o Loop, enviar um parâmetro (NOME), e executar uma saída para função (SYSO(nome)) em uma só linha. Bem mais limpo, concorda?

Certo, mas até agora estamos utilizando uma função que o java já nos proporciona por padrão, e se eu quiser criar uma própria?

Criando uma Funcional Interface

Se você está habituado com as Interfaces tradicionais, vai notar que não temos diferença na criação de uma Functional Interface, exceto pela anotação @FunctionalInterface, que por boa prática deve ser colocada. Contudo vamos criar uma FunctionalInterface chamada MyFuncInterface e um método contendo 1 String como saída e 2 Strings como entrada.

Agora vamos criar nossa classe responsável por utilizar essa Functional Interface. O nome da nossa classe será UseFunctional com 1 método chamado: make. O método Make terá como saída uma String e como entrada 2 Strings e um objeto chamado func da nossa Interface MyFuncInterface.

Algo estranho? Observe que estamos chamando 1 método chamado “method” de uma Interface, e que até então não possui comportamento. Logo poderíamos imaginar que iriamos criar uma Classe que estende dessa Interface, correto? Mas não é isso que queremos.

Vamos então ao nosso código principal (Main), nele iremos criar o comportamento nossa função MyFuncInterface.  Para ela vamos atribuir um nome e sobrenome “(nome, sobrenome)” e somar os 2 como comportamento “-> nome + sobrenome”. (Agora sim a segunda parte do código)

Observe que são variáveis que não estão definidas em nenhum lugar, pois pertencem ao escopo da função.  Instanciamos nossa classe UseFunctional e podemos chamar o método make, passando nome, sobrenome e a função responsável pela operação.

 

Na prática

Bem agora vamos a um exemplo real. Digamos que você tenha uma lista de pessoas e seus respectivos carros (marcas). Se pedissem para que você realizasse uma busca de quantas pessoas tem o modelo de carro “Fiat”, como você faria? Normalmente iriamos criar 1 foeach verificando a cada iteração se o modelo do carro é igual a fiat, se sim adicionar +1 a um contador. E se eu te disse que através de função podemos fazer tudo em 1 única linha?

 

Terminamos por aqui. Espero que tenha ajudado de alguma forma no seu aprendizado e lembre-se que apesar de parecer confuso no início, depois de 1 tempo utilizando torna-se fácil. Para maiores informações deixo referências importantes. Preze sempre pela documentação oficial.

 

Referências:

http://www.baeldung.com/java-8-lambda-expressions-tips

http://www.oracle.com/technetwork/pt/articles/java/streams-api-java-8-3410098-ptb.html

https://pt.wikipedia.org/wiki/C%C3%A1lculo_lambda