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

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

If you can't read please download the document

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.

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

  • 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