TDC 2014 - Java 8: Expressões Lambda e API de Stream

Embed Size (px)

DESCRIPTION

Apresentação feita no evento The Developers Conference 2014 na trilha de Java sobre duas das principais novidades do Java 8: as Expressões Lambda e a API de Streams. As Expressões Lambda aumenta o poder de expressão da linguagem através de uma nova forma de implementar interfaces funcionais (interfaces com um único método) de forma mais fácil do que com classes anônimas e a API de Streams traz funcionalidades usadas de forma fluente e poderosa para manipular conjuntos de objetos.

Citation preview

  • 1. Java 8: Expresses Lambda e API de Stream The Developers Conference 2014 So Paulo

2. Danival Taffarel Calegari Mestre em Cincia da Computao pela Unicamp. Mais de 13 anos desenvolvendo aplicaes com Java e Java EE. Lder tcnico na MATERA Systems Instrutor na Globalcode Palestras em diversos eventos: JavaOne, TDC, JustJava, DevCamp, ... Certificaes: SCJP, SCBCD, SCWCD 3. Agenda Por que lambdas e Stream API? Interfaces funcionais Expresses Lambda Stream API Referncias 4. Por que lambdas e Stream API? A lngua evolui para tornar a comunicao mais eficiente. Altere a posio dos elementos de uma lista de clientes de tal forma que cada elemento tenha o valor do CPF maior ou igual ao elemento anterior e que tenha o valor do CPF menor ou igual ao do elemento posterior. Ordene a lista de clientes pelo CPF. O verbo ordenar nos permite expressar este conceito de uma forma mais direta e concisa. 5. Por que lambdas e Stream API? A linguagem Java tem evoluindo para aumentar seu poder de expresso: Collections API , Generics, Enhanced For Loops (for-each), Typesafe Enums, Annotations, Autoboxing/Unboxing, Varargs, Fork and Join, Try-with-resources statement, NIO 2.0, etc. Expresses lambda ajudam a remover cdigo repetitivo (boilerplate). Stream API permite o encadeamento de operaes sobre conjuntos de elementos. Tambm permite o processamento paralelo ou sequencial em colees para map-reduce. 6. Interfaces Funcionais Interfaces com apenas um mtodo. Muito usadas quando necessrio passar um comportamento (funo) como parmetro. @FunctionalInterface public interface Runnable { void run(); } @FunctionalInterface public interface Comparator { int compare(T o1, T o2); } public interface ActionListener extends EventListener { void actionPerformed(ActionEvent e); } 7. Expresses Lambda Programar bem encontrar a abstrao correta para o problema a ser resolvido. List clientes = clienteRepository.getAll(); List clientesFiltrados = new ArrayList(); for (Iterator it = clientes.iterator(); it.hasNext();) { Cliente cliente = it.next(); if (cliente.getIdade() >= 30) { clientesFiltrados.add(cliente); } } Cdigo correto, limpo e fcil de manter. Mas no a melhor abstrao. 8. Expresses Lambda Criando abstrao de filtrar uma lista por um critrio. @FunctionalInterface interface Criterio { boolean teste(T objeto); } static List filtrar(List lista, Criterio criterio) { List listaFiltrada = new ArrayList(); for (T objeto : lista) { if (criterio.teste(objeto)) { listaFiltrada.add(objeto); } } return listaFiltrada; } 9. Expresses Lambda Melhor abstrao, mas o cdigo ficou mais poludo pela incluso das partes repetitivas da declarao da classe annima. List clientes = clienteRepository.getAll(); List clientesFiltrados = Utilitarios.filtrar(clientes, new Criterio() { @Override public boolean teste(Cliente cliente) { return cliente.getIdade() >= 30; } }); 10. Expresses Lambda E agora, quem poder nos ajudar? 11. Expresses Lambda List clientes = clienteRepository.getAll(); List clientesFiltrados = Utilitarios.filtrar(clientes, new Criterio() { @Override public boolean teste(Cliente cliente) { return cliente.getIdade() >= 30; } }); 12. Expresses Lambda List clientes = clienteRepository.getAll(); List clientesFiltrados = Utilitarios.filtrar(clientes, cli -> cli.getIdade() >= 30); @FunctionalInterface interface Criterio { boolean teste(T objeto); } Corpo do Mtodo 13. Expresses Lambda Apenas para interfaces funcionais. No apenas um rostinho bonito para criar classes annimas. Utiliza invokedynamic e Nashorn (API de JavaScript) para tornar a execuo mais eficiente. Pela primeira vez promoveu mudanas coordenadas no compilador, na VM e em APIs. 14. Expresses Lambda Classes que sero utilizadas nos prximos exemplos: public class Collections { public static void sort(List list, Comparator