"Streamizando" com sucesso

339 visualizações

Publicada em

Aprendendo a trabalhar com a Stream API do Java 8, para tornar a vida do desenvolvedor Java mais simples na hora de manipular listas.

Publicada em: Software
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
339
No SlideShare
0
A partir de incorporações
0
Número de incorporações
10
Ações
Compartilhamentos
0
Downloads
5
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

"Streamizando" com sucesso

  1. 1. “STREAMIZANDO” COM SUCESSO Bruno Oliveira 6º JUGVALE
  2. 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. 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. 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. 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. 6. GOOGLE GUAVA • Java 1.6+ • API para manipulação de classes bastante utilizadas • Caching • Concorrência • Processamento de Strings • I/O • Collections!
  7. 7. GOOGLE GUAVA • Collections2 • Collections2.filter(Collection<E> unfiltered, Predicate<? Super E> predicate) • Começando a trabalhar com conceito de Predicate
  8. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 21. E PARA ENCERRAR... • forEach!!! List<Jogador> jogadores = Arrays.asList(...); jogadores.forEach(System.out::println); jogadores.stream().forEach(System.out::println);
  22. 22. DÚVIDAS?
  23. 23. OBRIGADO! bruno_vky@live.com bruno.vky@gmail.com @bruno_vky

×