Java 8 - Expressões Lambda e Stream API - DevCamp 2014

download Java 8 - Expressões Lambda e Stream API - DevCamp 2014

If you can't read please download the document

description

Apresentação feita no evento DevCamp 2014 sobre o Expressões Lambda e a nova API de Stream do Java 8.

Transcript of Java 8 - Expressões Lambda e Stream API - DevCamp 2014

  • 1. Java 8: Expresses Lambda e API de Stream

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 = Utilitarios.geraClientes(50); 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 = Utilitarios.geraClientes(50); 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 = Utilitarios.geraClientes(50); List clientesFiltrados = Utilitarios.filtrar(clientes, new Criterio() { @Override public boolean teste(Cliente cliente) { return cliente.getIdade() >= 30; } }); 12. Expresses Lambda List clientes = Utilitarios.geraClientes(50); List clientesFiltrados = Utilitarios.filtrar(clientes, cli -> cli.getIdade() >= 30); 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 Mais de um parmetro Collections.sort(clientes, (cli1, cli2) -> cli1.getVendas().compareTo(cli2.getVendas())); Mais de uma linha Collections.sort(clientes, (cli1, cli2) -> { int comp = cli1.getVendas().compareTo(cli2.getVendas()); if (comp == 0) { comp = cli1.getNome().compareTo(cli2.getNome()); } return comp; }); 15. Expresses Lambda Sem parmetros Executors.callable( () -> System.out.println("Imprime na thread")).call(); Referncia de mtodo String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" }; Arrays.sort(stringArray, String::compareToIgnoreCase); 16. Stream API Operaes encadeadas sobre um fluxo de objetos. Vrias interfaces funcionais representando operaes no pacote java.util.function Predicate, Supplier, Consumer, Function, etc. Integrado com a API de Collections Foi necessrio criar implementaes default para interfaces para viabilizar isto! Permite realizar operaes do tipo map-reduce. 17. Stream API List clientes = Utilitarios.geraClientes(50); clientes.stream().forEach(cli -> System.out.println(cli)); Imprime lista de clientes List clientesFiltrados = clientes.stream().filter(cli -> cli.getIdade() > 30) .sorted(Cliente::comparaVendas).collect(Collectors.toList()); Filtra clientes com idade menor que 30, ordena por vendas e gera coleo List clientesFiltradosParalelo = clientes.stream().parallel().filter(cli -> cli.getIdade() > 30) .sorted(Cliente::comparaVendas).collect(Collectors.toList()); Imprime lista de clientes 18. Stream API Divide as operaes em intermedirias e finais. As operaes intermedirias no executam, apenas preparam as estruturas para execuo. Nas operaes finais as operaes intermedirias so executadas e produzido um resultado. API fortemente inspirada no Guava (https://code.google.com/p/guava-libraries) Isto signifiva que podemos usar mesmo com Java 7, basta importar a biblioteca para o projeto. 19. Referncias Pgina oficial da Oracle com todos os recursos do Java 8 http://www.oracle.com/technetwork/java/javase/8-whats-new- 2157071.html Tutorial da Oracle sobre Expresses Lambda http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions. html Tutorial da Oracle sobre Stream API http://docs.oracle.com/javase/tutorial/collections/streams/index.html