SlideShare uma empresa Scribd logo
1 de 21
Java 8: Expressões Lambda e API de Stream
Danival Taffarel Calegari
● Mestre em Ciência da Computação pela Unicamp.
● Mais de 13 anos desenvolvendo aplicações com Java e Java
EE.
● Líder técnico na MATERA Systems
● Instrutor na Globalcode
● Palestras em diversos eventos: JavaOne, TDC, JustJava,
DevCamp
● Certificações: SCJP, SCBCD, SCWCD
Agenda
● Por que lambdas e Stream API?
● Interfaces funcionais
● Expressões Lambda
● Stream API
● Referências
Por que lambdas e Stream API?
● A língua evolui para tornar a comunicação mais eficiente.
● Altere a posição 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.
Por que lambdas e Stream API?
● A linguagem Java tem evoluindo para aumentar seu poder de
expressão:
● 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.
● Expressões lambda ajudam a remover código repetitivo
(boilerplate).
● Stream API permite o encadeamento de operações sobre
conjuntos de elementos. Também permite o processamento
paralelo ou sequencial em coleções para map-reduce.
Interfaces Funcionais
● Interfaces com apenas um método.
● Muito usadas quando é necessário passar um comportamento
(função) como parâmetro.
@FunctionalInterface
public interface Runnable {
void run();
}
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}
public interface ActionListener extends EventListener {
void actionPerformed(ActionEvent e);
}
Expressões Lambda
● Programar bem é encontrar a abstração correta para o
problema a ser resolvido.
List<Cliente> clientes = Utilitarios.geraClientes(50);
List<Cliente> clientesFiltrados = new ArrayList<>();
for (Iterator<Cliente> it = clientes.iterator(); it.hasNext();) {
Cliente cliente = it.next();
if (cliente.getIdade() >= 30) {
clientesFiltrados.add(cliente);
}
}
● Código correto, “limpo” e fácil de manter. Mas não é a melhor
abstração.
Expressões Lambda
● Criando abstração de filtrar uma lista por um critério.
@FunctionalInterface
interface Criterio<T> {
boolean teste(T objeto);
}
static <T> List<T> filtrar(List<T> lista, Criterio<T> criterio) {
List<T> listaFiltrada = new ArrayList<>();
for (T objeto : lista) {
if (criterio.teste(objeto)) {
listaFiltrada.add(objeto);
}
}
return listaFiltrada;
}
Expressões Lambda
● Melhor abstração, mas o código ficou mais “poluído” pela
inclusão das partes “repetitivas” da declaração da classe
anônima.
List<Cliente> clientes = Utilitarios.geraClientes(50);
List<Cliente> clientesFiltrados =
Utilitarios.filtrar(clientes, new Criterio<Cliente>() {
@Override
public boolean teste(Cliente cliente) {
return cliente.getIdade() >= 30;
}
});
Expressões Lambda
● E agora, quem poderá nos ajudar?
Expressões Lambda
List<Cliente> clientes = Utilitarios.geraClientes(50);
List<Cliente> clientesFiltrados =
Utilitarios.filtrar(clientes, new Criterio<Cliente>() {
@Override
public boolean teste(Cliente cliente) {
return cliente.getIdade() >= 30;
}
});
Expressões Lambda
List<Cliente> clientes = Utilitarios.geraClientes(50);
List<Cliente> clientesFiltrados =
Utilitarios.filtrar(clientes, cli -> cli.getIdade() >= 30);
Expressões Lambda
● Apenas para interfaces funcionais.
● Não é apenas “um rostinho bonito” para criar classes
anônimas.
● Utiliza invokedynamic e Nashorn (API de JavaScript) para tornar a
execução mais eficiente.
● Pela primeira vez promoveu mudanças coordenadas no
compilador, na VM e em APIs.
Expressões Lambda
● Mais de um parâmetro
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;
});
Expressões Lambda
● Sem parâmetros
Executors.callable(
() -> System.out.println("Imprime na thread")).call();
● Referência de método
String[] stringArray = { "Barbara", "James", "Mary", "John",
"Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);
Stream API
● Operações encadeadas sobre um fluxo de objetos.
● Várias interfaces funcionais representando operações no
pacote java.util.function
● Predicate, Supplier, Consumer, Function, etc.
● Integrado com a API de Collections
● Foi necessário criar implementações default para interfaces para
viabilizar isto!
● Permite realizar operações do tipo map-reduce.
Stream API
List<Cliente> clientes = Utilitarios.geraClientes(50);
clientes.stream().forEach(cli -> System.out.println(cli));
● Imprime lista de clientes
List<Cliente> 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 coleção
List<Cliente> clientesFiltradosParalelo =
clientes.stream().parallel().filter(cli -> cli.getIdade() > 30)
.sorted(Cliente::comparaVendas).collect(Collectors.toList());
● Imprime lista de clientes
Stream API
● Divide as operações em intermediárias e finais.
● As operações intermediárias não executam, apenas preparam
as estruturas para execução.
● Nas operações finais as operações intermediárias são
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.
Referências
● Página 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 Expressões 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
Java 8 - Expressões Lambda e Stream API - DevCamp 2014

Mais conteúdo relacionado

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

Padrões de projeto em linguagens funcionais
Padrões de projeto em linguagens funcionaisPadrões de projeto em linguagens funcionais
Padrões de projeto em linguagens funcionaisItalos Estilon
 
Estrutura de linguagem de programação - Aula 2.pptx
Estrutura de linguagem de programação - Aula 2.pptxEstrutura de linguagem de programação - Aula 2.pptx
Estrutura de linguagem de programação - Aula 2.pptxMarceloRosenbrock1
 
Desmistificando Built-in Functions, Lambda e List Comprehension...
Desmistificando Built-in Functions, Lambda e List Comprehension...Desmistificando Built-in Functions, Lambda e List Comprehension...
Desmistificando Built-in Functions, Lambda e List Comprehension...Matheus Pereira
 
Database Class - Pontos de defasagem e questões de brinde.
Database Class - Pontos de defasagem e questões de brinde.Database Class - Pontos de defasagem e questões de brinde.
Database Class - Pontos de defasagem e questões de brinde.Jann Claude Mousquer
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 
Arquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine LearningArquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine LearningFelipe Santos
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
Palestra: LINQ via C#
Palestra: LINQ via C# Palestra: LINQ via C#
Palestra: LINQ via C# Thiago Vidal
 
Rails - EXATEC2009
Rails - EXATEC2009Rails - EXATEC2009
Rails - EXATEC2009Caue Guerra
 
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010lucashungaro
 
GraphQL na Era das APIs
GraphQL na Era das APIsGraphQL na Era das APIs
GraphQL na Era das APIsDaniel Varanda
 

Semelhante a Java 8 - Expressões Lambda e Stream API - DevCamp 2014 (20)

Map, filter e reduce
Map, filter e reduceMap, filter e reduce
Map, filter e reduce
 
Padrões de projeto em linguagens funcionais
Padrões de projeto em linguagens funcionaisPadrões de projeto em linguagens funcionais
Padrões de projeto em linguagens funcionais
 
Estrutura de linguagem de programação - Aula 2.pptx
Estrutura de linguagem de programação - Aula 2.pptxEstrutura de linguagem de programação - Aula 2.pptx
Estrutura de linguagem de programação - Aula 2.pptx
 
Introdução ao GraphQL
Introdução ao GraphQLIntrodução ao GraphQL
Introdução ao GraphQL
 
Desmistificando Built-in Functions, Lambda e List Comprehension...
Desmistificando Built-in Functions, Lambda e List Comprehension...Desmistificando Built-in Functions, Lambda e List Comprehension...
Desmistificando Built-in Functions, Lambda e List Comprehension...
 
Database Class - Pontos de defasagem e questões de brinde.
Database Class - Pontos de defasagem e questões de brinde.Database Class - Pontos de defasagem e questões de brinde.
Database Class - Pontos de defasagem e questões de brinde.
 
Novidades do .Net 4.0
Novidades do .Net 4.0Novidades do .Net 4.0
Novidades do .Net 4.0
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
Arquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine LearningArquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine Learning
 
Java8
Java8Java8
Java8
 
Visualg
VisualgVisualg
Visualg
 
Evolução Plataforma Java
Evolução Plataforma JavaEvolução Plataforma Java
Evolução Plataforma Java
 
Explorando a API Rest Jira Cloud
Explorando a API Rest Jira CloudExplorando a API Rest Jira Cloud
Explorando a API Rest Jira Cloud
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Scheme
SchemeScheme
Scheme
 
Palestra: LINQ via C#
Palestra: LINQ via C# Palestra: LINQ via C#
Palestra: LINQ via C#
 
Rails - EXATEC2009
Rails - EXATEC2009Rails - EXATEC2009
Rails - EXATEC2009
 
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
 
GraphQL na Era das APIs
GraphQL na Era das APIsGraphQL na Era das APIs
GraphQL na Era das APIs
 

Mais de Danival Calegari

JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013
JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013
JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013Danival Calegari
 
Evitando as armadilhas no projeto de aplicações Java EE para uso eficaz da nuvem
Evitando as armadilhas no projeto de aplicações Java EE para uso eficaz da nuvemEvitando as armadilhas no projeto de aplicações Java EE para uso eficaz da nuvem
Evitando as armadilhas no projeto de aplicações Java EE para uso eficaz da nuvemDanival Calegari
 
JavaOne 2012 - BOF7955 ­ Avoiding Java EE Application Design Traps to Achieve...
JavaOne 2012 - BOF7955 ­ Avoiding Java EE Application Design Traps to Achieve...JavaOne 2012 - BOF7955 ­ Avoiding Java EE Application Design Traps to Achieve...
JavaOne 2012 - BOF7955 ­ Avoiding Java EE Application Design Traps to Achieve...Danival Calegari
 
Polis Hyperlink Dicas e truques de Performance para JPA e EJB
Polis Hyperlink Dicas e truques de Performance para JPA e EJBPolis Hyperlink Dicas e truques de Performance para JPA e EJB
Polis Hyperlink Dicas e truques de Performance para JPA e EJBDanival Calegari
 
JSR 352 Batch Applications for the Java Platform
JSR 352 Batch Applications for the Java PlatformJSR 352 Batch Applications for the Java Platform
JSR 352 Batch Applications for the Java PlatformDanival Calegari
 

Mais de Danival Calegari (6)

Tecnologias Netflix OSS
Tecnologias Netflix OSSTecnologias Netflix OSS
Tecnologias Netflix OSS
 
JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013
JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013
JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013
 
Evitando as armadilhas no projeto de aplicações Java EE para uso eficaz da nuvem
Evitando as armadilhas no projeto de aplicações Java EE para uso eficaz da nuvemEvitando as armadilhas no projeto de aplicações Java EE para uso eficaz da nuvem
Evitando as armadilhas no projeto de aplicações Java EE para uso eficaz da nuvem
 
JavaOne 2012 - BOF7955 ­ Avoiding Java EE Application Design Traps to Achieve...
JavaOne 2012 - BOF7955 ­ Avoiding Java EE Application Design Traps to Achieve...JavaOne 2012 - BOF7955 ­ Avoiding Java EE Application Design Traps to Achieve...
JavaOne 2012 - BOF7955 ­ Avoiding Java EE Application Design Traps to Achieve...
 
Polis Hyperlink Dicas e truques de Performance para JPA e EJB
Polis Hyperlink Dicas e truques de Performance para JPA e EJBPolis Hyperlink Dicas e truques de Performance para JPA e EJB
Polis Hyperlink Dicas e truques de Performance para JPA e EJB
 
JSR 352 Batch Applications for the Java Platform
JSR 352 Batch Applications for the Java PlatformJSR 352 Batch Applications for the Java Platform
JSR 352 Batch Applications for the Java Platform
 

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

  • 1. Java 8: Expressões Lambda e API de Stream
  • 2. Danival Taffarel Calegari ● Mestre em Ciência da Computação pela Unicamp. ● Mais de 13 anos desenvolvendo aplicações com Java e Java EE. ● Líder técnico na MATERA Systems ● Instrutor na Globalcode ● Palestras em diversos eventos: JavaOne, TDC, JustJava, DevCamp ● Certificações: SCJP, SCBCD, SCWCD
  • 3. Agenda ● Por que lambdas e Stream API? ● Interfaces funcionais ● Expressões Lambda ● Stream API ● Referências
  • 4. Por que lambdas e Stream API? ● A língua evolui para tornar a comunicação mais eficiente. ● Altere a posição 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 expressão: ● 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. ● Expressões lambda ajudam a remover código repetitivo (boilerplate). ● Stream API permite o encadeamento de operações sobre conjuntos de elementos. Também permite o processamento paralelo ou sequencial em coleções para map-reduce.
  • 6.
  • 7. Interfaces Funcionais ● Interfaces com apenas um método. ● Muito usadas quando é necessário passar um comportamento (função) como parâmetro. @FunctionalInterface public interface Runnable { void run(); } @FunctionalInterface public interface Comparator<T> { int compare(T o1, T o2); } public interface ActionListener extends EventListener { void actionPerformed(ActionEvent e); }
  • 8. Expressões Lambda ● Programar bem é encontrar a abstração correta para o problema a ser resolvido. List<Cliente> clientes = Utilitarios.geraClientes(50); List<Cliente> clientesFiltrados = new ArrayList<>(); for (Iterator<Cliente> it = clientes.iterator(); it.hasNext();) { Cliente cliente = it.next(); if (cliente.getIdade() >= 30) { clientesFiltrados.add(cliente); } } ● Código correto, “limpo” e fácil de manter. Mas não é a melhor abstração.
  • 9. Expressões Lambda ● Criando abstração de filtrar uma lista por um critério. @FunctionalInterface interface Criterio<T> { boolean teste(T objeto); } static <T> List<T> filtrar(List<T> lista, Criterio<T> criterio) { List<T> listaFiltrada = new ArrayList<>(); for (T objeto : lista) { if (criterio.teste(objeto)) { listaFiltrada.add(objeto); } } return listaFiltrada; }
  • 10. Expressões Lambda ● Melhor abstração, mas o código ficou mais “poluído” pela inclusão das partes “repetitivas” da declaração da classe anônima. List<Cliente> clientes = Utilitarios.geraClientes(50); List<Cliente> clientesFiltrados = Utilitarios.filtrar(clientes, new Criterio<Cliente>() { @Override public boolean teste(Cliente cliente) { return cliente.getIdade() >= 30; } });
  • 11. Expressões Lambda ● E agora, quem poderá nos ajudar?
  • 12. Expressões Lambda List<Cliente> clientes = Utilitarios.geraClientes(50); List<Cliente> clientesFiltrados = Utilitarios.filtrar(clientes, new Criterio<Cliente>() { @Override public boolean teste(Cliente cliente) { return cliente.getIdade() >= 30; } });
  • 13. Expressões Lambda List<Cliente> clientes = Utilitarios.geraClientes(50); List<Cliente> clientesFiltrados = Utilitarios.filtrar(clientes, cli -> cli.getIdade() >= 30);
  • 14. Expressões Lambda ● Apenas para interfaces funcionais. ● Não é apenas “um rostinho bonito” para criar classes anônimas. ● Utiliza invokedynamic e Nashorn (API de JavaScript) para tornar a execução mais eficiente. ● Pela primeira vez promoveu mudanças coordenadas no compilador, na VM e em APIs.
  • 15. Expressões Lambda ● Mais de um parâmetro 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; });
  • 16. Expressões Lambda ● Sem parâmetros Executors.callable( () -> System.out.println("Imprime na thread")).call(); ● Referência de método String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" }; Arrays.sort(stringArray, String::compareToIgnoreCase);
  • 17. Stream API ● Operações encadeadas sobre um fluxo de objetos. ● Várias interfaces funcionais representando operações no pacote java.util.function ● Predicate, Supplier, Consumer, Function, etc. ● Integrado com a API de Collections ● Foi necessário criar implementações default para interfaces para viabilizar isto! ● Permite realizar operações do tipo map-reduce.
  • 18. Stream API List<Cliente> clientes = Utilitarios.geraClientes(50); clientes.stream().forEach(cli -> System.out.println(cli)); ● Imprime lista de clientes List<Cliente> 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 coleção List<Cliente> clientesFiltradosParalelo = clientes.stream().parallel().filter(cli -> cli.getIdade() > 30) .sorted(Cliente::comparaVendas).collect(Collectors.toList()); ● Imprime lista de clientes
  • 19. Stream API ● Divide as operações em intermediárias e finais. ● As operações intermediárias não executam, apenas preparam as estruturas para execução. ● Nas operações finais as operações intermediárias são 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.
  • 20. Referências ● Página 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 Expressões 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