Chegando ao
Lambda
no Java 8
Como melhorar seu cdigo atual (e futuro)
utilizando funes Lambda.
Voc sabe ordenar uma lista? Sabe selecionar os elementos de uma
lista a partir de um critrio? E extrair os valores de uma determinada propriedade do objeto de uma lista?
So tarefas comuns que estamos cansados de repeti-las. Mas ser
que conhecemos a melhor forma de escrev-las? H como fazer de
forma mais concisa, sem perder a legibilidade?
Neste artigo vamos mostrar o que muda nessas tarefas do dia a dia
ao utilizar bibliotecas como o Google Guava e LambdaJ, que adicionam um sabor funcional ao Java atual. Depois chegaremos ao
futuro Java 8, para ver como o lambda e os defender methods esto
mudando a linguagem em direo ao funcional.
Paulo Silveira | paulo.silveira@caelum.com.br
Bacharel e mestre em computao pela Universidade de So Paulo. Fundador do GUJ.com.br, trabalha com Java h 11 anos. um
dos responsveis tcnicos pelos cursos da Caelum.
37 \
te.
/ 38
Google Guava
expressiva que as anteriores, todavia um pouco menos eficiente com relao ao desempenho. Recomenda-se verificar na pgina do projeto a sua anlise de
desempenho e a questo toda pode se resumir a um
trade-off, perdendo um pouco no desempenho para
ganhar na expressividade de cdigo. Sua principal
classe a Lambda, que contm uma srie de mtodos
(funes) estticos.
Inicialmente podemos imprimir o nome de todos
os participantes, para isso vamos utilizar a funo
joinFrom.
forEach(select(palestrantes,having(on(
Palestrante.class).getPostsNoGuj(),
greaterThanOrEqualTo(500)))).favoritar();
forEach(select(palestrantes,
comPostsMaiorQue(500))).favoritar();
O LambdaJ tambm possui uma classe LambdaCollection que segue o padro Fluent Interface assim
como o FluentIterable do Guava. Vamos utiliz-la
no seguinte problema: tendo uma lista de palestras
Agora a partir de uma lista de participantes, va- (considere a nova classe Palestra abaixo), selecionar
mos colocar todos os nomes em maisculo. Primeiro as palestras que tiveram uma votao superior a 100,
vamos extrair o nome dos participantes. Para isso, ento a partir desta selecionar os seus palestrantes
ordenados por quantidade de posts. Para isso vamos
ser usado o mtodo extract.
utilizar os mtodos with, que devolve uma referncia
List<String> nomesDosPalestrantes =
para uma LambdaCollection, retain, que tem funcioextract(palestrantes, on(Palestrante.class).
namento anlogo ao select e o extract que j vimos
getName());
previamente:
int totalDePosts = sumFrom(palestrantes).
getPostsNoGuj();
/ 40
});
Uma expresso lambda precisa sempre ser atribuda/inferida para uma interface/class abstrata que
possui apenas um nico mtodo abstrato (antigamente chamadas de SAM: single abstract method).
A especificao, ainda em andamento, as chamam
agora de functional interfaces. Por exemplo, para um
Runnable, conseguimos inferir um lambda que no
41 \
recebe argumentos:
Runnable r = () -> { System.out.println(); };
Iterable<Integer> posts =
palestrantes.map(Palestrante::getPostsNoGuj);
/ 42
/eu uso
Geraldo Ferraz | guilherme.ferraz@caelum.com.br
Analista desenvolvedor da Cast e ministra cursos na Caelum Braslia.
No projeto em que trabalho, chegamos no ponto em que melhorar legibilidade e expressividade tornou-se uma prioridade. Por muito tempo o projeto permaneceu com muitos loops e estruturas de condies encadeadas, e por mais que extrassemos mtodos no conseguamos ler o cdigo e saber de primeira o que estava sendo feito. Com o LambdaJ conseguimos melhorar todos os aspectos citados, entretanto,
adicionamos bastante complexidade e alta dependncia da API. Com alguma refatorao possvel deixar o cdigo de forma que a complexidade fique encapsulada tornando o uso muito mais intuitivo.
/referncias
> http://openjdk.java.net/projects/jdk8/
> http://openjdk.java.net/projects/lambda/
taforma. Ao mesmo tempo, alguns outros itens ainda ficaram de fora, como a sintaxe simplificada para
criao de colees e literais para membros da classe.
Consideraes finais
> http://code.google.com/p/lambdaj/wiki/LambdajFeatures
DSLs, interfaces fluentes e outros patterns envolvidos aqui:
> http://martinfowler.com/dsl.html
> http://martinfowler.com/bliki/FluentInterface.html
> http://blog.jayway.com/2012/02/07/builder-patternwith-a-twist/
Conhecendo mais do Guava:
> http://code.google.com/p/guava-libraries/
Expressividade, abstrao e conciso:
> http://www.joelonsoftware.com/items/2006/08/01.html
> http://gafter.blogspot.com.br/2007/03/on-expressivepower-of-programming.html
Um pouco de teoria sobre o clculo lambda e programao
funcional:
> http://steve.vinoski.net/pdf/IC-Welcome_to_the_
Functional_Web.pdf
> http://blog.caelum.com.br/comecando-com-o-calculolambda-e-a-programacao-funcional-de-verdade/
43 \