23
“STREAMIZANDO” COM SUCESSO Bruno Oliveira 6º JUGVALE

"Streamizando" com sucesso

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: "Streamizando" com sucesso

“STREAMIZANDO” COM SUCESSO

Bruno Oliveira

6º JUGVALE

Page 2: "Streamizando" com sucesso

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

Page 3: "Streamizando" com sucesso

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?

Page 4: "Streamizando" com sucesso

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...

Page 5: "Streamizando" com sucesso

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...

Page 6: "Streamizando" com sucesso

GOOGLE GUAVA

• Java 1.6+

• API para manipulação de classes bastante utilizadas

• Caching

• Concorrência

• Processamento de Strings

• I/O

• Collections!

Page 7: "Streamizando" com sucesso

GOOGLE GUAVA

• Collections2

• Collections2.filter(Collection<E> unfiltered, Predicate<? Super E> predicate)

• Começando a trabalhar com conceito de Predicate

Page 8: "Streamizando" com sucesso

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;

});

Page 9: "Streamizando" com sucesso

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();

Page 10: "Streamizando" com sucesso

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

}

Page 11: "Streamizando" com sucesso

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);

Page 12: "Streamizando" com sucesso

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());

Page 13: "Streamizando" com sucesso

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);

Page 14: "Streamizando" com sucesso

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);

Page 15: "Streamizando" com sucesso

FLAT MAP

Function<Jogador, Stream<Item>> function = j -> j.getItens().stream()

.sorted(Comparator.comparing(Item::getNome));

Stream<Item> itensDosJogadores = jogadores.stream().flatMap(function);

Page 16: "Streamizando" com sucesso

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!

Page 17: "Streamizando" com sucesso

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());

Page 18: "Streamizando" com sucesso

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

Page 19: "Streamizando" com sucesso

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()

Page 20: "Streamizando" com sucesso

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()

Page 21: "Streamizando" com sucesso

E PARA ENCERRAR...

• forEach!!!

List<Jogador> jogadores = Arrays.asList(...);

jogadores.forEach(System.out::println);

jogadores.stream().forEach(System.out::println);

Page 22: "Streamizando" com sucesso

DÚVIDAS?

Page 23: "Streamizando" com sucesso

OBRIGADO!

[email protected]

[email protected]

@bruno_vky