SlideShare uma empresa Scribd logo
“STREAMIZANDO” COM
SUCESSO
Bruno Oliveira
6º JUGVALE
ABOUT.ME
• Analista Desenvolvedor Java – TRIPEX LABS
• Entusiasta JavaFX
• Autor do livro “JavaFX: Interfaces com qualidade para aplicações Desktop” – Casa
do Código
• Alguns artigos sobre JavaFX... – MundoJ
• Viciado em aprender mais e mais do Java 8 
NOS PRIMÓRDIOS...
• Desde quando o mundo é mundo, todos usavam Arrays...
• int[] numbers = new int[10] {1, 2, 3, ..., 10};
• Mas tudo era complicado...
• Cadê redimensionamento?
• Cadê dinâmica?
AÍ SURGIU A COLLECTION API
• Since Java 1.2
• Possui dinâmica!
• É possível adicionar itens a uma lista, e ela vai se expandindo!
• Iteração descomplicada!
• Interface Iterable<E>
• Diversas formas de implementação!
• Lists
• Sets
• Maps
• E o mundo passou a ser melhor! Todos usavam alegremente a Collection API... 
ATÉ SURGIR ALGUNS PROBLEMAS...
• Como filtrar uma lista de objetos?
• Como ordenar uma lista?
• Como limitar seu tamanho?
• Como pular alguns objetos da lista?
• Como remover itens diante a uma certa condição?
• Etc...
GOOGLE GUAVA
• Java 1.6+
• API para manipulação de classes bastante utilizadas
• Caching
• Concorrência
• Processamento de Strings
• I/O
• Collections!
GOOGLE GUAVA
• Collections2
• Collections2.filter(Collection<E> unfiltered, Predicate<? Super E> predicate)
• Começando a trabalhar com conceito de Predicate
List<String> nomes = Arrays.asList(“Bruno”, “Henrique”, “Oliveira”, “JUGVale”);
List<String> nomesComMaisDe8Letras = Collections2.filter(nomes,
new Predicate<String>() {
public boolean accept(String str) {
return str != null && str.length() > 8;
});
CHEGA O JAVA 1.8 E A STREAM API
• Operações em listas no estilo funcional
• Uso de map-reduce
• Facilidades sempre sonhadas por desenvolvedores Java
• Uso: novo método da interface List (default method)
• Stream<String> myStream = myList.stream();
EXEMPLIFICANDO...
public class Jogador {
private String nome;
private int pontos;
private List<Item> itens;
// getters e setters omitidos
}
public class Item {
private String nome;
// getters e setters omitidos
}
FILTRAGEM DE DADOS
Desafio: Filtrar todos os jogadores com mais de 100 pontos
List<Jogador> jogadores = Arrays.asList(...);
Stream<Jogador> jogadoresComMaisDe100Pontos = jogadores.stream()
.filter(j -> j.getPontos() > 100);
ORDENAÇÃO
Desafio: Ordenar todos os jogadores por quantidade de pontos
List<Jogador> jogadores = Arrays.asList(...);
Stream<Jogador> jogadoresPorPontos = jogadores.stream().sorted(
Comparator.comparingInt(Jogador::getPontos).reversed());
MAP-REDUCE
• Desafio: Criar uma lista apenas com o nome dos jogadores
• List<Jogador> jogadores = Arrays.asList(...);
• Stream<String> nomesDosJogadores = jogadores.stream().map(Jogador::getNome);
FLAT MAP
Desafio: Criar uma lista de itens dos jogadores. Os itens estarão ordenados por nome.
List<Jogador> jogadores = Arrays.asList(...);
Function<Jogador, Stream<Item>> function = j -> j.getItens().stream()
.sorted(Comparator.comparing(Item::getNome));
Stream<Stream<Item>> itensDosJogadores = jogadores.stream().map(function);
FLAT MAP
Function<Jogador, Stream<Item>> function = j -> j.getItens().stream()
.sorted(Comparator.comparing(Item::getNome));
Stream<Item> itensDosJogadores = jogadores.stream().flatMap(function);
LEGAL, MAS CADÊ O RETORNO?
• Por enquanto, nossas operações estão retornando Stream<T>;
• IMPORTANTE: Stream não armazena valores, apenas trabalha com listas, ou seja,
Stream não é uma Collection nova!
• Para retornar uma List, usamos o método terminal collect!
COLLECTOR
Function<Jogador, Stream<Item>> function = j -> j.getItens().stream()
.sorted(Comparator.comparing(Item::getNome));
Stream<Item> itensDosJogadores = jogadores.stream().flatMap(function);
List<Item> itens = itensDosJogadores.collect(Collectors.toList());
MÉTODO TERMINAL?
• A Stream API possui métodos intermediários e terminais;
• Métodos intermediários = Funções para produzir operações em Collections (stream
pipelines)
• Métodos terminais = Funções para produzir um resultado em cima das operações
intermediárias
ALGUNS OUTROS MÉTODOS...
• Tratamento de Autoboxing e Unboxing:
• mapToInt (IntStream)
• mapToDouble (DoubleStream)
• Comparator.comparingInt (ToIntFunction)
• Comparator.comparingDouble (ToDoubleFunction)
• Métodos terminais em IntStream e DoubleStream
• max()
• sum()
ALGUNS OUTROS MÉTODOS...
• Eliminar itens iguais
• distinct()
• Encontrar o primeiro item que segue na Stream
• findFirst()
• Limitar tamanho da lista
• limit(long maxSize)
• Stream paralela (concorrência)
• parallel()
E PARA ENCERRAR...
• forEach!!!
List<Jogador> jogadores = Arrays.asList(...);
jogadores.forEach(System.out::println);
jogadores.stream().forEach(System.out::println);
DÚVIDAS?
OBRIGADO!
bruno_vky@live.com
bruno.vky@gmail.com
@bruno_vky

Mais conteúdo relacionado

KEY
Python em (mais de) 10 minutinhos
PDF
Basic Brainf*ck
PPT
Manual de Introdução ao Autocad R14 - Aula 03 - Introdução ao Windows (95)
PDF
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
PDF
API's Abertas Na Web 2 0
PPTX
Seminário - Java Collections
PDF
Collection Java (2/2)
PDF
Curso AngularJS - Parte 2
Python em (mais de) 10 minutinhos
Basic Brainf*ck
Manual de Introdução ao Autocad R14 - Aula 03 - Introdução ao Windows (95)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
API's Abertas Na Web 2 0
Seminário - Java Collections
Collection Java (2/2)
Curso AngularJS - Parte 2

Destaque (10)

PDF
Java collections-basic
PDF
A mágica por trás dos aplicativos ( Api com o Laravel )
PDF
Como implementar APIs RESTful em PHP
PDF
JavaFX 8, Collections e Lambdas
PDF
[Curso Java Basico] Exercicios Aulas 47 a 52
PDF
Estrutura de Dados e Algoritmos com Java #13-18: Pilhas (Stack)
PDF
Estrutura de Dados e Algoritmos com Java #01: Introducao
PDF
Introducao ao Ionic 2 na pratica
PDF
Criando e consumindo webservice REST com PHP e JSON
PDF
PHP e MySQL para iniciantes
Java collections-basic
A mágica por trás dos aplicativos ( Api com o Laravel )
Como implementar APIs RESTful em PHP
JavaFX 8, Collections e Lambdas
[Curso Java Basico] Exercicios Aulas 47 a 52
Estrutura de Dados e Algoritmos com Java #13-18: Pilhas (Stack)
Estrutura de Dados e Algoritmos com Java #01: Introducao
Introducao ao Ionic 2 na pratica
Criando e consumindo webservice REST com PHP e JSON
PHP e MySQL para iniciantes
Anúncio

Semelhante a "Streamizando" com sucesso (20)

ODP
meetup adopting java8
PDF
Curso de Java: Introdução a lambda e Streams
PDF
Curso java 08 - mais sobre coleções
PDF
Java 8 - New Features
PPTX
Curso de Java 7 - (ArrayList, Collections,(Set, List, Queue, Map)).pptx
PPTX
Programação Orientada por Objectos - Aula 4
PPTX
Programação Orientada por Objectos - Aula 4
PDF
Collections Java (1/2)
PPTX
Java: Collections
ODP
Java 12 Colecoes
PDF
Java Collections - Tomaz Lavieri
ODP
TDC 2014 - Java 8: Expressões Lambda e API de Stream
ODP
Java 8 - Expressões Lambda e Stream API - DevCamp 2014
PDF
Java Coleções
PDF
[Devcamp] usando programação funcional agora!
PDF
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
PDF
Java Is Back, Novidade do Java 8
PPTX
PPTX
Curso Java Básico - Aula 05
ODP
8 collections-i
meetup adopting java8
Curso de Java: Introdução a lambda e Streams
Curso java 08 - mais sobre coleções
Java 8 - New Features
Curso de Java 7 - (ArrayList, Collections,(Set, List, Queue, Map)).pptx
Programação Orientada por Objectos - Aula 4
Programação Orientada por Objectos - Aula 4
Collections Java (1/2)
Java: Collections
Java 12 Colecoes
Java Collections - Tomaz Lavieri
TDC 2014 - Java 8: Expressões Lambda e API de Stream
Java 8 - Expressões Lambda e Stream API - DevCamp 2014
Java Coleções
[Devcamp] usando programação funcional agora!
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
Java Is Back, Novidade do Java 8
Curso Java Básico - Aula 05
8 collections-i
Anúncio

Último (7)

PPTX
Curso de Windows 11 resumido na prática.pptx
DOC
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
DOC
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
PDF
apresentacao introducao computacao ead.pdf
PDF
Evolução em código: algoritmos genéticos com PHP
PDF
Dos requisitos ao código: como criar código rastreável em PHP
PPTX
Mapeamento de Objeto para Tabela Relacional
Curso de Windows 11 resumido na prática.pptx
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
apresentacao introducao computacao ead.pdf
Evolução em código: algoritmos genéticos com PHP
Dos requisitos ao código: como criar código rastreável em PHP
Mapeamento de Objeto para Tabela Relacional

"Streamizando" com sucesso

  • 2. ABOUT.ME • Analista Desenvolvedor Java – TRIPEX LABS • Entusiasta JavaFX • Autor do livro “JavaFX: Interfaces com qualidade para aplicações Desktop” – Casa do Código • Alguns artigos sobre JavaFX... – MundoJ • Viciado em aprender mais e mais do Java 8 
  • 3. NOS PRIMÓRDIOS... • Desde quando o mundo é mundo, todos usavam Arrays... • int[] numbers = new int[10] {1, 2, 3, ..., 10}; • Mas tudo era complicado... • Cadê redimensionamento? • Cadê dinâmica?
  • 4. AÍ SURGIU A COLLECTION API • Since Java 1.2 • Possui dinâmica! • É possível adicionar itens a uma lista, e ela vai se expandindo! • Iteração descomplicada! • Interface Iterable<E> • Diversas formas de implementação! • Lists • Sets • Maps • E o mundo passou a ser melhor! Todos usavam alegremente a Collection API... 
  • 5. ATÉ SURGIR ALGUNS PROBLEMAS... • Como filtrar uma lista de objetos? • Como ordenar uma lista? • Como limitar seu tamanho? • Como pular alguns objetos da lista? • Como remover itens diante a uma certa condição? • Etc...
  • 6. GOOGLE GUAVA • Java 1.6+ • API para manipulação de classes bastante utilizadas • Caching • Concorrência • Processamento de Strings • I/O • Collections!
  • 7. GOOGLE GUAVA • Collections2 • Collections2.filter(Collection<E> unfiltered, Predicate<? Super E> predicate) • Começando a trabalhar com conceito de Predicate
  • 8. List<String> nomes = Arrays.asList(“Bruno”, “Henrique”, “Oliveira”, “JUGVale”); List<String> nomesComMaisDe8Letras = Collections2.filter(nomes, new Predicate<String>() { public boolean accept(String str) { return str != null && str.length() > 8; });
  • 9. CHEGA O JAVA 1.8 E A STREAM API • Operações em listas no estilo funcional • Uso de map-reduce • Facilidades sempre sonhadas por desenvolvedores Java • Uso: novo método da interface List (default method) • Stream<String> myStream = myList.stream();
  • 10. EXEMPLIFICANDO... public class Jogador { private String nome; private int pontos; private List<Item> itens; // getters e setters omitidos } public class Item { private String nome; // getters e setters omitidos }
  • 11. FILTRAGEM DE DADOS Desafio: Filtrar todos os jogadores com mais de 100 pontos List<Jogador> jogadores = Arrays.asList(...); Stream<Jogador> jogadoresComMaisDe100Pontos = jogadores.stream() .filter(j -> j.getPontos() > 100);
  • 12. ORDENAÇÃO Desafio: Ordenar todos os jogadores por quantidade de pontos List<Jogador> jogadores = Arrays.asList(...); Stream<Jogador> jogadoresPorPontos = jogadores.stream().sorted( Comparator.comparingInt(Jogador::getPontos).reversed());
  • 13. MAP-REDUCE • Desafio: Criar uma lista apenas com o nome dos jogadores • List<Jogador> jogadores = Arrays.asList(...); • Stream<String> nomesDosJogadores = jogadores.stream().map(Jogador::getNome);
  • 14. FLAT MAP Desafio: Criar uma lista de itens dos jogadores. Os itens estarão ordenados por nome. List<Jogador> jogadores = Arrays.asList(...); Function<Jogador, Stream<Item>> function = j -> j.getItens().stream() .sorted(Comparator.comparing(Item::getNome)); Stream<Stream<Item>> itensDosJogadores = jogadores.stream().map(function);
  • 15. FLAT MAP Function<Jogador, Stream<Item>> function = j -> j.getItens().stream() .sorted(Comparator.comparing(Item::getNome)); Stream<Item> itensDosJogadores = jogadores.stream().flatMap(function);
  • 16. LEGAL, MAS CADÊ O RETORNO? • Por enquanto, nossas operações estão retornando Stream<T>; • IMPORTANTE: Stream não armazena valores, apenas trabalha com listas, ou seja, Stream não é uma Collection nova! • Para retornar uma List, usamos o método terminal collect!
  • 17. COLLECTOR Function<Jogador, Stream<Item>> function = j -> j.getItens().stream() .sorted(Comparator.comparing(Item::getNome)); Stream<Item> itensDosJogadores = jogadores.stream().flatMap(function); List<Item> itens = itensDosJogadores.collect(Collectors.toList());
  • 18. MÉTODO TERMINAL? • A Stream API possui métodos intermediários e terminais; • Métodos intermediários = Funções para produzir operações em Collections (stream pipelines) • Métodos terminais = Funções para produzir um resultado em cima das operações intermediárias
  • 19. ALGUNS OUTROS MÉTODOS... • Tratamento de Autoboxing e Unboxing: • mapToInt (IntStream) • mapToDouble (DoubleStream) • Comparator.comparingInt (ToIntFunction) • Comparator.comparingDouble (ToDoubleFunction) • Métodos terminais em IntStream e DoubleStream • max() • sum()
  • 20. ALGUNS OUTROS MÉTODOS... • Eliminar itens iguais • distinct() • Encontrar o primeiro item que segue na Stream • findFirst() • Limitar tamanho da lista • limit(long maxSize) • Stream paralela (concorrência) • parallel()
  • 21. E PARA ENCERRAR... • forEach!!! List<Jogador> jogadores = Arrays.asList(...); jogadores.forEach(System.out::println); jogadores.stream().forEach(System.out::println);